2

CUDAに次のクラスファンクターがあります

class forSecondMax{
private:
    int toExclude;
public:
    __device__ void setToExclude(int val){
        toExclude = val;
    }
    __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>(rhs) == get<2>(rhs)*/ && get<0>(lhs) != toExclude/* && get<0>(rhs)!= toExclude */) return get<1>(lhs) < get<1>(rhs); else
    return true ;
  }

};

ホストから toExclude の値を設定する方法はありますか?

4

1 に答える 1

1

これを達成するために解決する必要があるのは、引数からデータメンバーを設定するファンクターのコンストラクターを定義することだけです。したがって、クラスは次のようになります。

class forSecondMax{
    private:
        int toExclude;
    public:
        __device__ __host__ forSecondMax(int x) : toExclude(x) {};
        __device__ __host__ bool operator () 
            (const DereferencedIteratorTuple& lhs, 
             const DereferencedIteratorTuple& rhs) 
            {
                using thrust::get;
                if (get<0>(lhs)== get<2>(lhs) && get<0>(lhs) != toExclude) 
                    return get<1>(lhs) < get<1>(rhs);
                else
                    return true ;
            }

};

[免責事項:ブラウザで記述されており、テストやコンパイルは行われていません。自己責任で使用してください]

ファンクターを推力アルゴリズムに渡す前に値を設定するには、ファンクターのインスタンスを作成して、それを推力呼び出しに渡します。次に例を示します。

forSecondMax op(10);
thrust::remove_if(A.begin(), A.end(), op);

toExcludeこれにより、クラスの新しいインスタンスでデータメンバーが値10に設定され、ストリーム圧縮呼び出しでそのインスタンスが使用されます。

于 2013-01-08T10:49:32.340 に答える