c++ CUDA推力:如何使用掩码进行最大化归约操作?

11dmarpk  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个双精度向量x[]。我有另一个布尔值xMask[]的长向量。他们有相同的尺寸。我想使用Thrust来计算x[],但仅适用于xMask[]为真的那些元素。例如:

x =     [1,    2,     3,    4,     5,    6,     7,    8]
xMask = [true, false, true, false, true, false, true, false]

x[]xMask[]的Maximum-Reduce是7(不是8,因为xMask[]的值是false)。
我可以在Thrust中轻松做到这一点吗?

am46iovg

am46iovg1#

到目前为止,在Thrust中还没有一个名为reduce_if的函数,这将是您正在搜索的。对于给定的函数,有多种方法可以做到这一点,哪种方法最适合你的问题可能取决于掩码中true s与false s的比例以及它们的分布方式。
也就是说,实现这一点的规范方法是将transform_reducezip_iterator一起使用:

#include <thrust/device_vector.h>
#include <thrust/functional.h>
#include <thrust/transform_reduce.h>
#include <thrust/iterator/zip_iterator.h>
#include <thrust/zip_function.h>

int reduce_if(thrust::device_vector<int> const &data,
              thrust::device_vector<bool> const &mask) {
  return thrust::transform_reduce(
      thrust::make_zip_iterator(thrust::make_tuple(
          data.cbegin(), mask.cbegin())),
      thrust::make_zip_iterator(thrust::make_tuple(
          data.cend(), mask.cend())),
      thrust::make_zip_function(
          [] __host__ __device__ (int value, bool flag){
            return flag ? value : 0;
          }),
      0,
      thrust::plus<int>{});
}

要编译这个,nvcc需要--extended-lambda标志。

相关问题