功能对象无法正常工作

时间:2012-12-22 20:02:42

标签: c++ cuda gpu gpgpu thrust

我定义了以下函数对象:

struct Predicate1
{
   __device__ bool operator () 
       (const DereferencedIteratorTuple& lhs, const DereferencedIteratorTuple& rhs) 
  {
    using thrust::get;
    //if you do <=, returns last occurence of largest element. < returns first
    if (get<0>(lhs)== get<2>(lhs) && get<0>(lhs)!= 3) return get<1>(lhs) < get<1>(rhs); 
    else
    return true ;
  }
};

其中DereferencedIteratorTuple如下:

typedef thrust::tuple<int, float,int> DereferencedIteratorTuple;

此外,我称之为:

result =  thrust::max_element(iter_begin, iter_end, Predicate1());

但结果是元组(3,.99,4)。我很困惑,为什么这是结果,因为条件get<0>(lhs)== get<2>(lhs)不适用于此元组的if。因此,对于此元组的每次比较,运算符都返回true。但是,thrust::max_element定义如下:

  

“此版本使用函数对象comp比较对象。   具体来说,这个版本的max_element返回第一个迭代器i   在[first,last]中,对于[first,last]中的每个迭代器j,   comp(* i,* j)是假的。“

因此,没有办法选择这个元组,操作符永远不会返回false。请让我知道我做错了什么

1 个答案:

答案 0 :(得分:0)

谓词帮助算法确定要选择哪个元素。如果谓词返回true,则算法优先于rhs lhs。如果它返回false,则算法优先于lhs rhs。在谓词始终返回true的情况下,算法将选择数组中的最后一个元素。对于stl和推力算法都是如此。

我猜,你的结果在比较过程中从未出现lhs,而且每次都没有过滤,因为rhs的第二个值小于0.99。

如果你想过滤这些值,你最好重写你的谓词。