【问题标题】:Cudamemcpy function usageCudamemcpy 函数使用
【发布时间】:2013-05-12 01:24:23
【问题描述】:

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;

【问题讨论】:

  • 首先,为什么要为二维数组使用堆栈?它总是很小吗?其次,二维数组存储在一个连续的内存块中,因此您确实可以使用单个cudaMemcpy() 将数据复制到一维设备数组。至于 2D CUDA 数组,它有点复杂。您可以在 Stack Overflow 上找到一些信息和示例(例如 here)。
  • 另外,你的 N 和 M 在编译过程中是否已知?
  • 是的,它们是已知的,二维数组可能是 1024*1024 或更大
  • 谢谢你的链接,我去看看
  • 看看cudaMemcpy2D函数

标签: cuda


【解决方案1】:

在主机和设备之间复制数据时,处理双下标 C 数组并非易事。在大多数情况下,cudaMemcpy(包括cudaMemcpy2D)需要一个用于源和目标的普通指针,而不是指向指针的指针。

(我认为)最简单的方法是在主机和设备上“展平”二维数组,并使用索引算法来模拟二维坐标:

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

【讨论】:

  • 不,我认为我可以使用索引算法处理一维数组,因为内存分配不会有任何区别。所以谢谢!
  • cudaMalloc 采用双指针。应该是cudaMalloc((void **)&d_myimagen ...
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 2013-05-10
  • 2022-07-12
  • 2011-08-02
  • 2013-11-13
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多