2

簡単な例では、まだアクセスされていない最小値を見つけようとしました。

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 throw_min.cu -Xcompiler -rdynamic,-Wall,-Wextra -lineinfo -o throw_min

gcc バージョン 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC)、CUDA 5 を使用しています。

min_element の呼び出し中に述語を省略しても、エラーは発生しません...これは、デフォルトの「less」ファンクターを使用すると思います。

助けてください。

4

1 に答える 1