我想使用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());
答案 0 :(得分:0)
是的,有。我想你应该看看Extrema和Zip 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不确定什么会更快。