我有一个结构向量如下:
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向量的设备进行深度复制。我该怎么做呢?
答案 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);