2013-07-22 45 views
0

结构的多个阵列假设有一些基元的结构体的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参数

+0

CUDA计算能力2.0及以上版本支持双精度运算,否则编译器会抛出双精度浮点数,请注意编译将无误地执行 – TripleS

+0

我告诉过你,double指针('**')会使这个额外的具有挑战性的。如果你想看看如何将'**'数组从主机复制到设备,请看[这里](http://stackoverflow.com/questions/6137218/cuda-2d-array-problem/6137517#6137517)。这不是因为心脏不好。请注意,a.lasram首先建议在主机上展平*。我还建议你接受a.lasram给出的答案,如果你有他们,请发表新的问题。当你进行批发编辑并发布大部分已经被回答的旧问题时,它会让这个问题变得凌乱和令人困惑,让其他人阅读。 –

回答

4

cudaMemcpy,cudaMemcpy2DcudaMemcpyArrayToArray都从主机中的连续存储区域复制到设备上的连续存储区域。

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

+0

有关其他讨论,您可能会对我的答案感兴趣[此处](http://stackoverflow.com/questions/15431365/cudamemcpy-segmentation-fault/15435592#15435592)。双指针(**)更具挑战性。建议您将数据平铺到连续区域,正如a.lasram所暗示的那样。 –

+0

感谢您的回答。通过扁平数据,你的意思是将整个结构序列化成一个字节数组吗? – brito

+0

@brito是的,将整个结构序列化为一个连续的字节数组 –