在这种情况下,cudaMemcpy函数将如何工作?
我已经声明了一个这样的矩阵
float imagen[par->N][par->M];
我想把它复制到cuda设备上,所以我这样做了
float *imagen_cuda;
int tam_cuda=par->M*par->N*sizeof(float);
cudaMalloc((void**) &imagen_cuda,tam_cuda);
cudaMemcpy(imagen_cuda,imagen,tam_cuda,cudaMemcpyHostToDevice);
这会很好地将2d数组复制到1d数组吗?
如何才能复制到另一个2d数组?我能改变这一点吗?它能工作吗?
float **imagen_cuda;
发布于 2013-05-18 03:44:28
在主机和设备之间复制数据时,处理双下标C数组不是一件容易的事。在大多数情况下,cudaMemcpy
(包括cudaMemcpy2D
)需要源和目标的普通指针,而不是指针到指针。
最简单的方法(我认为)是在主机和设备上“展平”2D数组,并使用索引算法来模拟2D坐标:
float imagen[par->N][par->M];
float *myimagen = &(imagen[0][0]);
float myval = myimagen[(rowsize*row) + col];
然后,您可以使用普通的cudaMemcpy操作来处理传输(使用myimagen
指针):
float *d_myimagen;
cudaMalloc((void **)&d_myimagen, (par->N * par->M)*sizeof(float));
cudaMemcpy(d_myimagen, myimagen, (par->N * par->M)*sizeof(float), cudaMemcpyHostToDevice);
如果你真的想处理动态大小的(也就是编译时未知的)双下标数组,你可以查看这个question/answer。
https://stackoverflow.com/questions/16599501
复制相似问题