c++ CUDA Thrust如何在不具体化数据的情况下合并copy_if和transform

vyu0f0g1  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(109)

假设我们有两个输入,第一个是数组,第二个是位图

thrust::device_vector<point_t> points;
Bitset bits; // Imagine this can be accessed within the kernel.

字符串
我想做的是将有效点复制到输出向量。

thrust::device<point_t> output;


要访问Bitset,我需要给予一个正好是points数组索引的数字。
逻辑是这样的:

for(size_t i = 0; i < points.size(); i++) {
    if (bits.is_active(i)) {
        output.push_back(points[i]);
    }
}


我相信这可以通过copy_ifmake_transform_iteratormake_zip_iterator等的组合来实现。但是我需要copy_if的 predicate 在转换之前访问该值。我该怎么做?

auto get_point =
        [] __device__(const thrust::tuple<size_t, point_t>& t) {
          return thrust::get<1>(t);
        };

    auto it1 = thrust::make_transform_iterator(
        thrust::make_zip_iterator(thrust::make_tuple(
            thrust::counting_iterator<size_t>(0), points.begin())),
        get_point);
    auto it2 = thrust::make_transform_iterator(
        thrust::make_zip_iterator(thrust::make_tuple(
            thrust::counting_iterator<size_t>(points.size()), points.end())),
        get_point);

    thrust::copy_if(
        thrust::cuda::par.on(stream), it1, it2,
        output.begin(),
        [=] __device__(const thrust::tuple<size_t, point_t>& t) {
          auto index = thrust::get<0>(t);

          return bits.is_active(index);
        });

p5cysglq

p5cysglq1#

多亏了Abator,他的解决方案奏效了。

auto end = thrust::copy_if(
    thrust::cuda::par.on(stream), 
    points.begin(), 
    points.end(),
    thrust::counting_iterator<size_t>(0),
    output.begin(),
    [=] __device__(size_t i) { return bits.is_active(i); }
);

字符串

相关问题