0

在回答我之前的问题时,有人给了我以下代码:

thrust::device_vector<bool> bools;
thrust::device_vector<float> values;

typedef thrust::device_vector<bool>::iterator   BoolIterator;
typedef thrust::device_vector<float>::iterator  ValueIterator;
typedef thrust::tuple<BoolIterator, ValueIterator> IteratorTuple;
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 IteratorTuple& lhs, const IteratorTuple& lhs) 
  {
    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()); 

我想了解 Predicate 结构。如果运算符返回 false 会发生什么?选择哪个值?如果运算符返回 true 会发生什么?选择哪个值?

4

1 回答 1

1

我试图实现“小于”谓词。true如果 lhs <= rhs 则返回,否则返回 false。此外,您要求通过存储在第二个数组中的布尔标志排除值,因此它会检查它。

从我的评论:

我想我过度优化了代码。这是“小于”谓词。if条件评估false意味着一个或布尔标志是false,所以我们需要排除相应的值。所以我们检查是否lhs应该排除参数(thrust::get<0>(lhs) == false),如果这是真的,谓词返回真,意思是“lhs 小于 rhs”。如果(thrust::get<0>(lhs) == true), thanrhs组件应该被排除并且谓词返回 false,意味着 'lhs 不小于 rhs'

我折叠了以下代码:

using thrust::get;
if (get<0>(lhs) && get<0>(rhs) ) return get<1>(lhs) <= get<1>(rhs); else 
// we need co check which value should be excluded from the seach
if (get<0>(lhs) == false) // lhs should be excluded so lhs is lesser
                          // OR both should be excluded and no matter what 
                          // we will return it will be eliminated in other comparison
  return true; else
if (get<0>(rhs) == false) // rhs should be excluded so rhs is lesser
  return false;
于 2012-12-21T12:30:53.900 回答