了解cudaMalloc的用法来分配矩阵

时间:2014-03-06 01:23:04

标签: c++ cuda

在尝试理解cudaMalloc()如何为2d矩阵工作时,我遇到了以下帖子:

Using cudaMalloc to allocate a matrix

我想澄清一下talonmies给出的答案,因此创建了这个单独的帖子。 Talonmies给出了以下解决方案。

float **pa;
float **pah = (float **)malloc(pah, N * sizeof(float *));    
cudaMalloc((void***)&pa,  N*sizeof(float*));
for(i=0; i<N; i++) {
    cudaMalloc((void**) &(pah[i]), N*sizeof(float));
    cudaMemcpy (pah[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice);
}
cudaMemcpy (pa, pah, N*sizeof(float *), cudaMemcpyHostToDevice);

第5行的代码:

cudaMalloc((void**) &(pah[i]), N*sizeof(float));

在设备存储器中创建一个块N *浮点空间,并将第i个设备存储器块的起始地址放在pah [i]中。 pah [i]驻留在主机存储器中,但每个pah [i]的内容是在设备中创建的存储器的地址。

问题1&gt;以上理解是否正确?

第6行的代码:

 cudaMemcpy (pah[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice);

将A [i]从主机复制到pah [i]的内容(pah [i]的内容是每个N *浮点块的起始地址)。

问题2&gt;上面对主机内存如何被复制到设备内存的理解是正确的吗?

为了访问设备中的(N,N)内存块(由上面的第5行创建),就像二维数组一样,我们现在需要将所有pah [i]的内容复制到一个设备中的指针。因此,首先在第3行中的代码在设备中创建N个浮点指针。然后使用第8行中的代码将N *浮动块的地址从pah [i]复制到pa。之后我们将能够访问驻留在主机中的A [i] [j]的内容,其中pa [i] [j]驻留在设备中。

问题3&gt;以上理解是否正确?

现在说我生成N * N线程并使用每个线程的线程id更改pa [i] [j]的内容。然后我想将驻留在设备中的pa [i] [j]的内容复制回驻留在主机中的A [i] [j]。下面的代码行是否可以完成工作,或者我是否犯了错误?

for (i=0; i<N; i++)
  cudaMemcpy(A[i], pa[i], N*sizeof(float), cudaMemcpyDeviceToHost);  

提前感谢所有帮助我澄清这些疑问/问题的人。

最佳

1 个答案:

答案 0 :(得分:2)

  

问题1&gt;以上理解是否正确?

  

问题2&gt;上面对主机内存如何被复制到设备内存的理解是正确的吗?

也许。我会说:“复制N * sizeof(float)字节,从A[i]中包含的(主机)地址开始,从主机到设备,从pah[i]中包含的设备地址开始。”

  

问题3&gt;以上理解是否正确?

是的,我可能会说一些不同的事情,但我可能做出的改变似乎很小。我想你已经得到了它。

  

下面的代码行是否可以完成工作,或者我是否犯了错误?

应该是:

for (i=0; i<N; i++)
  cudaMemcpy(A[i], pah[i], N*sizeof(float), cudaMemcpyDeviceToHost); 

您实际上想要反转第6行中包含的操作。   每当您遇到CUDA代码问题时,请不要忘记使用proper cuda error checking