我有以下数据结构:
struct Data {
int* ptr;
int a;
int b;
}
我需要从主机传递的GPU上有一系列这样的结构。这样做的简单方法是
thrust::host_vector<Data> h;
... // fill vector 'h'
thrust::device_vector<Data> d = h;
棘手的时刻是如何为ptr
分配内存以及如何在那里复制数据。有什么建议吗?
答案 0 :(得分:1)
已根据您对@Heatsink的评论更新,如果我理解正确,您说的是
struct Data {
int* ptr;
int a, b;
};
和
vector<Data> data;
data[0].ptr
指向包含data[0].a
和data[0].b
的GPU内存如果这是正确的,那么我会推荐以下组织:
struct Data {
int a, b;
};
thrust::host_vector<Data> h;
thrust::device_vector<Data> d = h;
h[i]
的GPU内存只是d[i]
。我不建议将每个元素的指针存储到GPU内存中,也不希望为每个数据对象分配单独的GPU内存(会非常慢)。如果你使用单独的数组,你的计算代码仍然可能会更快
通常将数据组织为数组结构而不是结构数组是出于多种原因,包括对齐和负载合并的简易性。