【问题标题】:Efficient way to reduce a subset of vector using thrust/cuda使用推力/cuda 减少矢量子集的有效方法
【发布时间】:2020-06-12 12:01:19
【问题描述】:

假设我们有一个大小为 10^16 的推力设备向量和另一个大小为 10^8 的向量,其中包含一些索引(不一定是排序的)。如果它的索引在第二个向量中,我们想对第一个向量的所有元素求和。

这样做的一个天真的方法是使用 transform_reduce 推力。但是,我相信它将涉及遍历第一个向量的所有元素。

有没有有效的方法?

【问题讨论】:

标签: cuda thrust reduction


【解决方案1】:

按照排列迭代器的 talonmies 建议,这里是实现向量子集约简的代码主体。我故意选择了小的矢量尺寸来解释这个想法。对于合理的尺寸,它比使用 inner_product 更快

    thrust::device_vector<double> vals(6);
    vals[0] = 2.0; vals[1] = 1.5; vals[2] = -1.2;
    vals[3] = 1.1; vals[4] = -4.3; vals[5] = 0.8;

    thrust::device_vector<int> indices(3);
    indices[0] = 1; indices[1] = 3; indices[2] = 5;

    thrust::device_vector<double> masks(6);

    for (auto elm:indices)
        masks[elm]=1.0;

    typedef thrust::device_vector<double>::iterator ValIterator;
    typedef thrust::device_vector<int>::iterator IndIterator;

    thrust::permutation_iterator<ValIterator, IndIterator> iter_begin(vals.begin(),
                                                                      indices.begin());
    thrust::permutation_iterator<ValIterator, IndIterator> iter_end(vals.end(),
                                                                    indices.end());

    double sum_reduce = thrust::reduce(iter_begin, iter_end);
    std::cout << "sum permutation iterator: " << sum_reduce << std::endl;

    double sum_inner_product = thrust::inner_product(vals.begin(), vals.end(),
                                                    masks.begin(), 0.0);
    std::cout << "sum inner product: " << sum_inner_product << std::endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2021-01-01
    • 2018-08-05
    • 2018-08-19
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多