虽然试图了解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);
在此先感谢所有帮助我澄清这些疑惑/疑问的人。
最佳
非常感谢您的意见和建议。我现在理解这个机制好得多。 – user1612986