在这种情况下,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);
这可以将二维数组复制到一维数组中吗?
如何复制到另一个二维数组?我可以改变这个吗?它会起作用吗?
float **imagen_cuda;
在主机和设备之间复制数据时,处理双下标 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);
如果您确实想处理动态大小(即在编译时未知)双下标数组,您可以查看此问题/答案 https://stackoverflow.com/questions/6137218/cuda-2d-array-problem.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)