使用Thrust在布尔条件下应用简化操作

时间:2012-12-21 10:44:03

标签: cuda thrust

我想使用thrust::reduce来查找数组A中的最大值。但是,如果A[i]也满足另一个数组B中的特定布尔条件,则只应将其选为最大值。例如,B [i]应该是真的。他们是推力::减少的版本吗?我查看了文档,发现只有以下API;

thrust::reduce(begin,end, default value, operator)

然而,我很好奇的是他们的版本更适合我的问题吗?

编辑:编译在最后一行失败!

      typedef thrust::device_ptr<int> IntIterator;
      typedef thrust::device_ptr<float> FloatIterator;
      typedef thrust::tuple<IntIterator,FloatIterator> IteratorTuple;
      typedef thrust::zip_iterator<IteratorTuple> myZipIterator;
      thrust::device_ptr<int> deviceNBMInt(gpuNBMInt);
    thrust::device_ptr<int> deviceIsActive(gpuIsActive);
    thrust::device_ptr<float> deviceNBMSim(gpuNBMSim);

    myZipIterator iter_begin = thrust::make_zip_iterator(thrust::make_tuple(deviceIsActive,deviceNBMSim));
    myZipIterator iter_end = thrust::make_zip_iterator(thrust::make_tuple(deviceIsActive + numRow,deviceNBMSim + numRow));
    myZipIterator result =  thrust::max_element(iter_begin, iter_end, Predicate());

1 个答案:

答案 0 :(得分:0)

是的,有。我想你应该看看ExtremaZip iterator

这样的事情应该可以解决问题(不确定这段代码是否可以直接使用):

typedef thrust::device_ptr<bool>  BoolIterator;
typedef thrust::device_ptr<float>  ValueIterator;

BoolIterator bools_begin, bools_end;
ValueIterator values_begin, values_end; 
// initialize these pointers
// ...

typedef thrust::tuple<BoolIterator, ValueIterator> IteratorTuple;
typedef thrust::tuple<bool, value> DereferencedIteratorTuple;
typedef thrust::zip_iterator<IteratorTuple> ZipIterator;

ZipIterator iter_begin(thrust::make_tuple(bools_begin, values_begin));
ZipIterator iter_end(thrust::make_tuple(bools_end, values_end));

struct Predicate
{
  __host__ __device__ bool operator () 
                      (const DereferencedIteratorTuple& lhs, 
                       const DereferencedIteratorTuple& lhs) 
  {
    using thrust::get;
    if (get<0>(lhs) && get<0>(rhs) ) return get<1>(lhs) < get<1>(rhs); else
    return ! get<0>(lhs) ;
  }
};

ZipIterator result =  thrust::max_element(iter_begin, iter_end, Predicate());

或者您可以考虑使用带有thrust::reduce的zip迭代器的类似技术。或者你可以试试inner_product不确定什么会更快。