使用推力/cuda减少矢量子集的有效方法

使用推力/cuda减少矢量子集的有效方法,cuda,thrust,reduction,Cuda,Thrust,Reduction,比如说,我们有一个尺寸为10^16的推力装置矢量和另一个尺寸为10^8的矢量,其中包含一些不必排序的指数。如果第一个向量的索引在第二个向量中,我们要求和第一个向量的所有元素 这样做的一个简单方法是使用转换来减少推力。但是,我相信这将涉及迭代第一个向量的所有元素 有没有一种有效的方法?根据Talonmes对置换迭代器的建议,下面是实现向量子集约简的代码主体。我特意选择了小的向量大小来解释这个想法。对于合理的尺寸,它比使用内部产品更快 thrust::device_vector<dou

比如说,我们有一个尺寸为10^16的推力装置矢量和另一个尺寸为10^8的矢量,其中包含一些不必排序的指数。如果第一个向量的索引在第二个向量中,我们要求和第一个向量的所有元素

这样做的一个简单方法是使用转换来减少推力。但是,我相信这将涉及迭代第一个向量的所有元素


有没有一种有效的方法?

根据Talonmes对置换迭代器的建议,下面是实现向量子集约简的代码主体。我特意选择了小的向量大小来解释这个想法。对于合理的尺寸,它比使用内部产品更快

    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;


可能是一个置换迭代器:谢谢。事实上,我在这里需要的是置换迭代器,代码运行速度更快。如果您添加一个简短的答案,向未来的访问者解释您的解决方案,那将是一件好事