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

时间:2013-07-22 00:37:16

标签: c++ c struct cuda memcpy

假设一个带有一些基元的结构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数组,然后是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参数?

1 个答案:

答案 0 :(得分:4)

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

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