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