【发布时间】:2013-07-20 15:32:45
【问题描述】:
假设一个结构 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 参数?
【问题讨论】:
-
CUDA计算能力2.0及以上支持双精度运算,否则编译器会将double转换为float,请注意编译不会出错
-
我告诉过你,双指针 (
**) 使这更具挑战性。如果您想了解如何将**数组从主机复制到设备,请查看here。这不适合胆小的人。请注意,a.lasram 建议首先在主机上展平。我还建议您接受 a.lasram 给出的答案,如果有新问题,请发布。当您进行批量编辑并在已回答的旧问题中发布大部分新问题时,这会使其他人阅读问题变得混乱和困惑。