CUDA使用cudaMemcpy复制多个结构数组



假设一个结构X有一些基元和一个Y结构数组:

typedef struct 
{ 
   int a;    
   Y** y;
} X;

X的实例X1在主机上初始化,然后通过cudaMemcpy复制到设备内存上的X的实例X2。

这对X中的所有基元(如int a)都很有效,但cudaMemcpy似乎会将任何双指针扁平化为单指针,从而在访问X中的结构数组(如y)的任何地方都会导致越界异常。

在这种情况下,我是否应该使用另一个memcpy函数,如cudaMemcpy2D或cudaMemcpyArrayToArray?

我们非常感谢您的建议。谢谢

编辑

复制一个结构数组的自然方法(如"如果它只是C,我会这么做")是对数组进行cudaMalloc,然后对每个元素进行单独初始化,例如:

X** h_x;
X** d_x;
int num_x;
cudaMalloc((void**)&d_x, sizeof(X)*num_x);
int i=0;
for(;i<num_x;i++)
{
    cudaMalloc((void**)d_x[i], sizeof(X));
    cudaMemcpy(&d_x[i], &h_x[i], sizeof(X), cudaMemcpyHostToDevice);
}

然而,for的cudaMalloc会产生崩溃。我承认我还不适应在Cuda函数中使用指针,所以也许我把cudaMalloc和cudaMemcpy参数搞砸了?

cudaMemcpycudaMemcpy2DcudaMemcpyArrayToArray都从主机中的连续内存区域复制到设备上的连续内存区。

您必须将所有数据复制到发送到设备的中间连续缓冲区中。

最新更新