将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/