让我们说,我们有一个大小为10 ^ 16的推力设备矢量,另一个是大小为10 ^ 8的矢量,其中包含一些索引(不一定要排序)。如果第一个向量的索引在第二个向量中,则我们希望对所有向量求和。
天真的方法是使用推力的transform_reduce。但是,我相信它将涉及遍历第一个向量的所有元素。
有没有有效的方法?
根据置换迭代器的建议,此处是实现向量子集约简的代码主体。我特意选择了较小的向量大小来解释这个想法。对于合理的大小,它比使用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;