尝试在Thrust设备比较器上使用模板

时间:2015-08-25 16:34:44

标签: c cuda thrust

结构的声明非常简单。出于某种原因,当我尝试使用模板来定义比较器时,我无法使用与该元组相关联的.get(),因此以下代码在t1.get< 0>()以及所有其余部分引发错误。我想理解为什么当你使用模板时,元组没有长寿.get()作为函数。

template<typename FirstType, typename SecondType>
struct TupleComp{

    typedef typename thrust::device_vector<FirstType >::iterator firstIter;
    typedef typename thrust::device_vector<SecondType>::iterator secondIter;

    typedef typename thrust::tuple<firstIter,secondIter> TupleType;

     __host__ __device__
    bool operator()(const TupleType &t1, const TupleType &t2)
    {
        // thrust::tuple<thrust::device_vector<long long>::iterator > tup;
         TupleType tup;


         if(t1.get<0>() < t2.get<0>()){
             return true;
         }

         if(t1.get<0>() > t2.get<0>()){
             return false;
         }

         return (t1.get<1>() < t2.get<1>());

     }
};

以下是类似的代码

struct TupleCompUllFirstLLSecond{


    typedef typename thrust::tuple<thrust::device_vector<unsigned long long>::iterator,thrust::device_vector<long long>::iterator> TupleType;

     __host__ __device__
    bool operator()(const TupleType &t1, const TupleType &t2)
    {

         if(t1.get<0>() < t2.get<0>()){
             return true;
         }

        if(t1.get<0>() > t2.get<0>()){
             return false;
        }

         return (t1.get<1>() < t2.get<1>());

    }
};

1 个答案:

答案 0 :(得分:1)

感谢Robert Crovella(他巧合地解决了我迄今为止的所有推力问题)解决方案是修复了我在比较和使用thrust :: get而不是元组t1.get的元组中出现的错误。工作比较函子是:

template<typename FirstType, typename SecondType>
struct TupleComp{



    typedef typename thrust::tuple<FirstType,SecondType> TupleType;

     __host__ __device__
    bool operator()(const TupleType &t1, const TupleType &t2)
    {

         FirstType leftFirst = thrust::get<0>(t1);
         FirstType rightFirst = thrust::get<0>(t2);


         if(leftFirst < rightFirst){
             return true;
         }

         if(leftFirst > rightFirst){
             return false;
         }

         SecondType leftSecond = thrust::get<1>(t1);
         SecondType rightSecond = thrust::get<1>(t2);


         return leftSecond < rightSecond;

    }
};