0

cudamemcpy2d 返回错误 - 以下是下面代码中的代码,我提到了我遇到错误的行。请查看并帮助我。

main(){
    int nrow = 16,ncol = 41; 
// 
    double **x = new double*[nrow];
    double **y = new double*[nrow];

    for(int i=0; i<nrow; i++){
        x[i] = new double[ncol];
        y[i] = new double[ncol];
    }

 // both x and y are filled with some values and function is called;
    function(x,y, nrow, ncol);
}

void function(double **x, double **y, int nrow, ncol){
      double *dev_x, *dev_y;
      size_t pitch_x, pitch_y;

      cudaMallocPitch((void **) &dev_x, &pitch_x, (n_col*sizeof(double)), nrow);
      cudaMallocPitch((void **) &dev_y, &pitch_y, (n_col*sizeof(double)), nrow);

   // this below line is returning error invalid value

      cudaMemcpy2D((void *)dev_x, pitch_x, (void *) *x, sizeof(double)*ncol, sizeof(double)*ncol, nrow, cudaMemcpyDeviceToHost);

  //launch a kernel
  kernel<<< 1, 1>>>(dev_x, dev_y, nrow, ncol);

   //below also gives the same error..

      cudaMemcpy2D((void *) *x, sizeof(double)*ncol, dev_x, pitch_x, sizeof(double)*ncol, nrow, cudaMemcpyHostToDevice);
}

请帮忙谢谢

4

1 回答 1

1

你的方向颠倒了。第一个cudaMemcpy2D操作是从主机复制到设备,您应该指定cudaMemcpyHostToDevice.

同样,第二个cudaMemcpy2D方向是另一个方向(基于您传递的指针的顺序),因此应该指定cudaMemcpyDeviceToHost.

您传递给的第一个指针cudaMemcpy2D是目标指针。

您的使用*d_IntPts_X也可能是一个问题。通常,您应该将单个指针 ( *) 扁平化的一维数组传递给 cudaMemcpy 类型的操作。但是由于您没有显示该变量/指针的定义,所以我不能肯定地说。

编辑: 现在您已经更改了参数,您不能x在 cudaMemcpy2D 中以这种方式使用您的数组。相反,将 x 展平为一维数组,可能是这样的:

double *flat_x = new double[nrow*ncol];

cudaMemcpy2D并在您的通话中使用它。

此外,在 CUDA 标签上有很多这样的问题。在问“为什么?”之前,请搜索并阅读其中一些内容。“它不处理二维矩阵吗?” “如果我真的想使用二维矩阵怎么办?” 等等

于 2014-04-02T18:01:27.587 回答