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

时间:2015-12-10 13:11:14

标签: 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{
      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++)
    {
    .........
    }

我想从CPU到结构B的STL向量的设备进行深度复制。我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

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);