首页 > 解决方案 > 如何在 CUDA 中的主机和设备之间正确分配和复制二维数组

问题描述

是否可以复制这样分配的 2D 主机阵列

h_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   h_A[i]=(int*)malloc(3*sizeof(int));
}

到这样分配的 2D 设备数组

cudaMallocPitch((void**)&d_A, &pitch, 3*sizeof(int), N);

我尝试从主机复制到设备并返回到主机以检查该过程是否有效,结果是只有前 2 行正确复制

https://drive.google.com/file/d/1gXpChyYd2Div0pDjTRxZhwYd7GHRfjXN/view?usp=sharing

从主机阵列 h_A 复制到设备阵列 d_A

cudaMemcpy2D(d_A, pitch, h_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyHostToDevice);

从设备阵列 d_A 复制到主机阵列 d_B

cudaMemcpy2D(h_B, pitch, d_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyDeviceToHost);

标签: arrayscuda

解决方案


如果您分配一个指针数组来存储行,如下所示:

h_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   h_A[i]=(int*)malloc(3*sizeof(int));
}

然后使用传统设备内存将其分配并移动到类似的设备端结构需要:

dh_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   int* p; 
   cudaMalloc(&p, 3*sizeof(int))
   cudaMemcpy(p, h_A[i], 3*sizeof(int), cudaMemcpyHostToDevice);
   dh_A[i]=p;
}

int** d_A = cudaMalloc(&d_A, sizeof(int*) * N);
cudaMemcpy(d_A, dh_A, N*sizeof(int*), cudaMemcpyHostToDevice);

[注意:所有代码都是在浏览器中编写的,不保证能正确编译或工作]

我将把它作为练习留给读者如何执行设备到主机副本。此时,您可能会得出结论,在主机和设备上都使用线性内存更简单。它将更简单更快。


推荐阅读