结构的多个阵列假设有一些基元的结构体的X和Y结构的数组:CUDA复制与cudaMemcpy
typedef struct
{
int a;
Y** y;
} X;
X的实例X1在主机进行初始化,然后将其复制到实例X2的X,通过cudaMemcpy在设备内存上。
这对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);
}
然而,为的cudaMalloc产生崩溃我承认我不是在CUDA函数指针的使用而舒适的,所以也许我搞砸了与cudaMalloc和cudaMemcpy参数
?
CUDA计算能力2.0及以上版本支持双精度运算,否则编译器会抛出双精度浮点数,请注意编译将无误地执行 – TripleS
我告诉过你,double指针('**')会使这个额外的具有挑战性的。如果你想看看如何将'**'数组从主机复制到设备,请看[这里](http://stackoverflow.com/questions/6137218/cuda-2d-array-problem/6137517#6137517)。这不是因为心脏不好。请注意,a.lasram首先建议在主机上展平*。我还建议你接受a.lasram给出的答案,如果你有他们,请发表新的问题。当你进行批发编辑并发布大部分已经被回答的旧问题时,它会让这个问题变得凌乱和令人困惑,让其他人阅读。 –