0

假设一个结构 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 参数?

4

1 回答 1

4

cudaMemcpy,cudaMemcpy2D并且cudaMemcpyArrayToArray全部从主机中的连续内存区域复制到设备上的连续内存区域。

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

于 2013-07-22T00:41:54.873 回答