使用zip_iterators为device_ptr定义推力Min_element的谓词时出错

时间:2013-05-30 03:15:45

标签: cuda gpgpu thrust

在简单的例子中,我试图找到尚未访问的最小值。

float *cost=NULL;
cudaMalloc( (void **) &cost, 5 * sizeof(float) );

bool *visited=NULL;
cudaMalloc( (void **) &visited, 5 * sizeof(bool) );

thrust::device_ptr< float > dp_cost( cost );
thrust::device_ptr< bool > dp_visited( visited );

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

BoolIterator bools_begin = dp_visited, bools_end = dp_visited +5;
ValueIterator values_begin = dp_cost, values_end = dp_cost +5; 


typedef thrust::tuple<BoolIterator, ValueIterator> IteratorTuple;
typedef thrust::tuple<bool, float> DereferencedIteratorTuple;
typedef thrust::zip_iterator<IteratorTuple> NodePropIterator;

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


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

NodePropIterator min_el_pos = thrust::min_element( iter_begin, iter_end, nodeProp_comp() );

DereferencedIteratorTuple tmp = *min_el_pos;

但是在编译时我得到了这个错误。

thrust_min.cu(99):错误:没有重载函数的实例“thrust :: min_element”匹配参数列表             参数类型是:(NodePropIterator,NodePropIterator,nodeProp_comp)

在编译“/tmp/tmpxft_00005c8e_00000000-6_thrust_min.cpp1.ii”时检测到1个错误。

我使用编译:

nvcc -gencode arch = compute_30,code = sm_30 -G -g thrust_min.cu -Xcompiler -rdynamic,-Wall,-Wextra -lineinfo -o thrust_min

我正在使用gcc版本4.6.3 20120306(Red Hat 4.6.3-2)(GCC),CUDA 5.

如果我在调用min_element期间省略谓词,那么我没有错误...我猜测它使用了默认的'less'仿函数。

请帮忙。

1 个答案:

答案 0 :(得分:1)

我问过这个,似乎在c ++ 03中,本地类型(即nodeProp)不能用作模板参数,因为它没有链接。您可能需要查看此(非推力相关的)SO question/answer以进行其他讨论。

作为模板库的推力依赖于此。所以我认为我的建议是将用于推力操作的仿函数放在全球范围内。

如果您认为还有其他问题在起作用,您可能希望发布一个带有示例的新问题。但是,对于您在此问题中发布的代码,我认为这就是原因,我已经证明reordering the code解决了这个问题。注意结构定义实际上是这里的问题,而不是typedef。