Cudamemcpy函数用法

时间:2013-05-17 00:17:31

标签: cuda

在这种情况下,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;

1 个答案:

答案 0 :(得分:4)

在主机和设备之间复制数据时,处理双下标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