C++ 从CPU到设备的结构向量的深度拷贝

C++ 从CPU到设备的结构向量的深度拷贝,c++,cuda,gpgpu,C++,Cuda,Gpgpu,我有一个结构向量,如下所示: struct nuc{ double Ax; double Ay; double Az; }; struct Cont{ int owner_ID; nuc A; double c[20]; double e[20]; int am; int size; double nrn; }; struct L{

我有一个结构向量,如下所示:

    struct nuc{
    double Ax;
    double Ay;
    double Az;
    };

    struct Cont{
      int owner_ID;
      nuc A;
      double c[20];
      double e[20];

      int am;
      int size;
      double nrn;
    };

    struct L{
      int n1;
      int n2;
      int n3;
    };


    struct Atomic_Orbital{
      L  ag;
      Cont cont;
    };
vector<Atomic_Orbital> B;

    B.resize(100);
    for(int i=0; i<100; i++)
    {
    .........
    }
struct-nuc{
双斧;
双Y;
双Az;
};
结构控制{
int所有者ID;
nuc A;
双c[20];
双e[20];
国际调幅;
整数大小;
双nrn;
};
结构L{
int-n1;
int n2;
int n3;
};
结构原子轨道{
L银;
续续;
};
载体B;
B.调整大小(100);

对于(int i=0;i
std::vector
而言,它在内存中连续存储其元素,基本上是一个普通数组,添加了奇特的访问器和大小调整器。而且,由于所讨论的所有结构都是可复制的(它们只包含POD类型,没有自定义的复制/移动构造函数),
cudaMemcpy
可以很好地复制它们。所以您可以这样做:

Atomic_Orbital *devPtr;
size_t size = B.size() * sizeof(Atomic_Orbital);
cudaMalloc(&devPtr, size);
cudaMemcpy(devPtr, B.data(), size, cudaMemcpyHostToDevice);
(省略了错误检查、琐碎的强制转换等)

要将数据从设备复制回主机,只需使用相反的复制方向:

cudaMemcpy(B.data(), devPtr, size, cudaMemcpyDeviceToHost);

std::vector
将其元素连续存储在内存中,它基本上是一个普通数组,添加了奇特的访问器和大小调整器。而且由于所有相关结构都是可复制的(它们只包含POD类型,没有自定义的复制/移动构造函数),
cudaMemcpy
可以很好地复制它们。所以您可以这样做:

Atomic_Orbital *devPtr;
size_t size = B.size() * sizeof(Atomic_Orbital);
cudaMalloc(&devPtr, size);
cudaMemcpy(devPtr, B.data(), size, cudaMemcpyHostToDevice);
(省略了错误检查、琐碎的强制转换等)

要将数据从设备复制回主机,只需使用相反的复制方向:

cudaMemcpy(B.data(), devPtr, size, cudaMemcpyDeviceToHost);
非常感谢您的回答(输入:CudaMemcpyHostToDevice->CudaMemcpyHostToDevice),我如何将数据带回CPU?非常感谢您的回答(输入:CudaMemcpyHostToDevice->CudaMemcpyHostToDevice),我如何将数据带回CPU?