1

基本上,我有一个“稀疏风格”数据集,

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)这不允许我使用花哨的迭代器。我认为我只是在搜索中使用了不正确的术语,或者只是没有足够的创意。

4

1 回答 1

2

这听起来像是典型的分散操作。Thrust 有一个scatter 函数,可以让你做这样的事情:

thrust::scatter(values.begin(), values.end(), indexes.begin(), expanded.begin());

这将分散values到 的索引中expanded

于 2013-04-15T14:46:21.357 回答