2014-03-06 138 views
0

虽然试图了解cudaMalloc()是如何工作的,因为我遇到下列此帖一二维矩阵:了解cudaMalloc的使用分配矩阵

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>上述理解是否正确?

在第6行的代码:

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

份A [I]从主机到PAH [I](PAH的内容的内容[I]是所述N的起始地址*浮动块)。

问题2>以上对主机内存如何被复制到设备内存的理解是否正确?

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

问题3>上述理解是否正确?

现在说我产生了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); 

在此先感谢所有帮助我澄清这些疑惑/疑问的人。

最佳

回答

2

问题1>是上面的理解是否正确?

是。

问题2>以上对主机内存如何被复制到设备内存的理解是否正确?

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

问题3>是上面的理解是否正确?

是的,我可能会字不同的几件事情,但我可能会做出改变似乎不大。我想你已经明白了。

将下面的代码行做的工作,还是我造成任何错误

它应该是:?

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

你从字面上想扭转包含在第6行 不要忘记使用proper cuda error checking您在使用CUDA代码的麻烦随时操作。

+0

非常感谢您的意见和建议。我现在理解这个机制好得多。 – user1612986