使用cudaMalloc分配矩阵

使用cudaMalloc分配矩阵,cuda,Cuda,我使用cudaMalloc和cudaMemcpy分配矩阵,并将向量数组复制到矩阵中,如下所示: float **pa; cudaMalloc((void***)&pa, N*sizeof(float*)); //this seems to be ok for(i=0; i<N; i++) { cudaMalloc((void**) &(pa[i]), N*sizeof(float)); //this gives seg fault cudaMemc

我使用cudaMalloc和cudaMemcpy分配矩阵,并将向量数组复制到矩阵中,如下所示:

float **pa;    
cudaMalloc((void***)&pa,  N*sizeof(float*)); //this seems to be ok
for(i=0; i<N; i++) {
    cudaMalloc((void**) &(pa[i]), N*sizeof(float)); //this gives seg fault
    cudaMemcpy (pa[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice); // also i am not sure about this
}
float**pa;
Cudamaloc((无效***)和pa,N*sizeof(浮动*)//这似乎没问题

因为(i=0;i
pa
在设备内存中,所以
和(pa[i])
不能达到您期望的效果。这将起作用

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);
float**pa;
浮点数**pah=(浮点数**)malloc(pah,N*浮点数*);
Cudamaloc((无效***)和pa,N*sizeof(浮动*);

对于(i=0;i这段代码的最终目标是什么?正如上面所暗示的,将pa展平为一维阵列以便在GPU上使用可能会符合您的最佳利益。类似于:

float *pa;
cudaMalloc((void**)&pa, N*N*sizeof(float));

不幸的是,您必须调整A[i]以这种方式进行内存复制。

谢谢您的回答。为什么指针数组不适合GPU?因为指针数组需要两个内存事务才能从全局内存中检索值。全局内存访问在GPU上有很高的延迟,所以两次访问全局内存以获取值远不如一次访问全局内存lus几个IOPs,这就是索引到线性1D内存分配所需的成本。你的意思是:cudaMemcpy(pah[i],a[i],N*sizeof(float),cudamemcpyhostodevice);在for之后的第一行?(a应该是我程序中的矩阵,因此a[i]a向量)抱歉,这是一个输入错误,在cudaMemcpy中应该是pah。我如何才能将矩阵从设备复制到主机的矩阵?我已经完成了(pgpu在主机中,pc在设备中):cudaMemcpy(pgpu,pc,Nsizeof(float),cudaMemcpyDeviceToHost);然而,当我尝试访问pgpu时,它给出了seg FAULT感谢您的回答。talonmies所说的完全符合我的要求
float *pa;
cudaMalloc((void**)&pa, N*N*sizeof(float));