基本上,我有一个"稀疏的风格"数据集,
thrust::device_vector<int> indexes(smallsize);
thrust::device_vector<float> values(smallsize);
我想将其扩展为单个
thrust::device_vector<float> expanded(fullsize);
我知道如何使用内核执行此操作:
template <typename T>
__global__ void AssignByIndex
(
T* inval,
T* outval,
size_t* keys,
int Ilength
)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
if (index < Ilength)
{
const size_t key = keys[index];//cross access,slow
outval[key]=inval[index];
}
};
但是1)这感觉就像推力可以轻易做到的事情2)这不允许我使用花哨的迭代器。我想我只是在搜索中使用了错误的术语,或者只是缺乏足够的创造力。
答案 0 :(得分:2)
这听起来像是典型的分散操作。 Thrust有scatter function,你可以这样做:
thrust::scatter(values.begin(), values.end(), indexes.begin(), expanded.begin());
这会将values
分散到expanded
的索引中。