Cudamemcpy函数用法

Cudamemcpy函数用法,cuda,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_

在这种情况下,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
)需要一个普通的源和目标指针,而不是指向指针的指针

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

float imagen[par->N][par->M];
float *myimagen = &(imagen[0][0]);
float myval = myimagen[(rowsize*row) + col];
然后,您可以使用普通的cudaMemcpy操作来处理传输(使用
myimagen
指针):


如果您真的想处理动态大小(即编译时未知)的双下标数组,您可以查看这一点。

首先,为什么要对2D数组使用堆栈?它总是很小吗?其次,2D数组存储在一个连续的内存块中,因此确实可以使用单个
cudaMemcpy()
将数据复制到1D设备数组中。至于2D CUDA阵列,它有点复杂。你可以找到一些关于堆栈溢出的信息和示例(例如)。另外,你的N和M在编译过程中是已知的吗?是的,它们是已知的,2d数组可能是1024*1024或更大的。谢谢你的链接,我将在cudaMemcpy2D函数查看outlook否,我认为我可以使用索引算法很好地处理1d数组,因为内存分配不会产生任何影响。谢谢!Cudamaloc使用双指针。它应该是
cudamaloc((void**)和d_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);