Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA使用cudaMemcpy复制多个结构数组_C++_C_Struct_Cuda_Memcpy - Fatal编程技术网

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

C++ CUDA使用cudaMemcpy复制多个结构数组,c++,c,struct,cuda,memcpy,C++,C,Struct,Cuda,Memcpy,假设一个包含一些基本体和Y结构数组的结构X: typedef struct { int a; Y** y; } X; X的实例X1在主机上初始化,然后通过cudaMemcpy复制到设备内存上的X的实例X2 这适用于X中的所有原语(如int a),但cudaMemcpy似乎将任何双指针展平为单个指针,从而在X(如y)中访问结构数组的任何位置都会导致越界异常 在这种情况下,我是否应该使用另一个memcpy函数,例如cudaMemcpy2D或cudaMemcpyArrayTo

假设一个包含一些基本体和Y结构数组的结构X:

typedef struct 
{ 
   int a;    
   Y** y;
} X;
X的实例X1在主机上初始化,然后通过cudaMemcpy复制到设备内存上的X的实例X2

这适用于X中的所有原语(如int a),但cudaMemcpy似乎将任何双指针展平为单个指针,从而在X(如y)中访问结构数组的任何位置都会导致越界异常

在这种情况下,我是否应该使用另一个memcpy函数,例如cudaMemcpy2D或cudaMemcpyArrayToArray

非常感谢您的建议。谢谢

编辑

复制结构数组的自然方法(如“如果只是C,我会这么做”)是先对数组进行cudamaloc,然后对每个元素分别进行cudamaloc和初始化,例如:

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);
}
X**h_X;
X**d_X;
int num_x;
cudamaloc((void**)和d_x,sizeof(x)*num_x);
int i=0;

对于(;i
cudaMemcpy
cudaMemcpy2D
cudamemcpyarray
所有从主机中的连续内存区域复制到设备上的连续内存区域


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

cudaMemcpy
cudaMemcpy2D
cudamemcpyarray
所有数据都从主机中的连续内存区域复制到设备上的连续内存区域


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

有关更多讨论,您可能对我的答案感兴趣。双指针(**)更具挑战性。建议您按照a.lasram的建议将数据展平到一个连续的区域。谢谢您的回答。通过展平数据,您的意思是将整个结构序列化为字节数组吗?@brito是的,将整个结构序列化为一个连续的字节array@a.lasram,有办法复制吗g整个结构只使用cudaMalloc和cudaMemcpys?由于涉及的结构复杂,我不愿意序列化。我用我试图编写的代码编辑了原始帖子。谢谢。@brito也许你误解了X**,X*和X,这就是导致崩溃的原因。请注意cudaMalloc((void**)&d_x,sizeof(x)*num_x)分配n次x*指针,其中n=(sizeof(x)*num_x)/sizeof(x*)。保持与主机相同的内存结构不是一个好主意。设备DRAM针对高带宽进行了优化,而延迟可能会很慢,缓存针对同一个扭曲内的高重用进行了优化。分散数据会影响性能。有关其他讨论,您可能会对我的答案感兴趣。双指针(**))更具挑战性。建议您按照a.lasram的建议将数据展平到一个连续的区域。谢谢您的回答。通过展平数据,您的意思是将整个结构序列化为字节数组吗?@brito是的,将整个结构序列化为一个连续的字节array@a.lasram,有办法复制吗g整个结构只使用cudaMalloc和cudaMemcpys?由于涉及的结构复杂,我不愿意序列化。我用我试图编写的代码编辑了原始帖子。谢谢。@brito也许你误解了X**,X*和X,这就是导致崩溃的原因。请注意cudaMalloc((void**)&d_x,sizeof(x)*num_x)分配n次x*指针,其中n=(sizeof(x)*num_x)/sizeof(x*)。保持与主机相同的内存结构不是一个好主意。设备DRAM针对高带宽进行了优化,而延迟可能会很慢,缓存针对同一个扭曲内的高重用进行了优化。分散数据将影响性能。CUDA compute capability 2.0及更高版本支持双感知操作,否则,编译器将如果将double转换为float,请注意编译不会出错。我告诉过您双指针(
**
)让这变得更具挑战性。如果你想看看如何将
***
阵列从主机复制到设备,请看。这不是为胆小的人准备的。请注意,a.lasram建议首先在主机上展开展开。我还建议你接受a.lasram给出的答案,如果你有新问题,就发布新问题。这会让问题变得混乱和混乱当你进行大量编辑并在你已经回答的旧问题中发布大部分新问题时,请让其他人阅读。CUDA compute capability 2.0及以上版本支持双感知操作,否则编译器会将double转换为float,请注意编译不会出错。我告诉过你双指针(
**
)让这变得更具挑战性。如果你想看看如何将
***
阵列从主机复制到设备,请看。这不是为胆小的人准备的。请注意,a.lasram建议首先在主机上展开展开。我还建议你接受a.lasram给出的答案,如果你有新问题,就发布新问题。这会让问题变得混乱和混乱当你做了大量的编辑,并且在你的旧问题中发布了大部分新问题,这些问题已经得到了回答,你就可以让其他人阅读了。