在这个简单的例子中,我试图找到尚未访问的最小值。
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;
但是在编译时我得到了这个错误。
推力最小.cu(99):错误:没有重载函数“推力:最小元素”的实例与参数列表参数类型匹配:(NodePropIterator,NodePropIterator,nodeProp_comp)
在“/tmp/tmpxft_00005c8e_00000000-6_thrust_min.cpp1.ii”的编译中检测到 1 个错误。
我编译使用:
nvcc -gencode arch=compute_30,code=sm_30 -G -gthrust_min.cu -Xcompiler -rdynamic,-Wall,-Wextra -lineinfo -othrust_min
我正在使用 gcc 版本 4.6.3 20120306(Red Hat 4.6.3-2)(GCC),CUDA 5。
如果我在调用 min_element ... 期间省略谓词,我不会收到任何错误,我猜它使用默认的“less”函子。
请帮忙。