将C++ 2D数组转换为CUDA 1D数组时出现错误。
让我展示我的源代码。

int main(void)
{
      float h_arr[1024][256];
      float *d_arr;

      // --- Some codes to populate h_arr

      // --- cudaMallocPitch
      size_t pitch;
      cudaMallocPitch((void**)&d_arr, &pitch, 256, 1024);

      // --- Copy array to device
      cudaMemcpy2D(d_arr, pitch, h_arr, 256, 256, 1024, cudaMemcpyHostToDevice);
}

我试图运行代码,但它弹出一个错误。

如何正确使用cudaMallocPitch()cudaMemcpy2D()

最佳答案

您编写的cudaMallocPitch调用看起来不错,但这是:

  cudaMemcpy2D(d_arr, pitch, h_arr, 256, 256, 1024, cudaMemcpyHostToDevice);

是不正确的。从documentation报价



因此,必须以字节为单位指定要复制的源间距和宽度。您的宿主矩阵的间距为sizeof(float) * 256字节,并且由于源间距和要复制的源的宽度相同,因此,您的cudaMemcpy2D调用应类似于:
 cudaMemcpy2D(d_arr, pitch, h_arr, 256*sizeof(float),
                256*sizeof(float), 1024, cudaMemcpyHostToDevice);

关于c++ - cudaMallocPitch和cudaMemcpy2D,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35771430/

10-13 08:35