0

NVidia CUDA / Thrustを学習するために、簡単なプログラムを作成しようとしています。私は完全な初心者です。私がやろうとしているのは、カスタム述語でfind_ifを使用することです。今のところ私の述語はすべてに対してtrueを返すだけなので、すべての入力を取得しようとしています。最終的に文字列を検索し、ファンクターを文字列Xで初期化してから、GPUが一致するすべての文字列を見つけられるようにします。

ここでいくつかの点で混乱しています。

文字列へのポインタでいっぱいのdevice_vectorを埋めてから、MemCmp述語に対して実行しようとしています。

まず、device_vectorは文字列をメインメモリからGPUメモリにコピーすることを「知っている」のでしょうか、それともポインタ値をコピーするだけでしょうか。

次に、「count = d_inputVector.end()--iter;」の行で これは、find_ifの結果であるイテレータ内のアイテムの数である12を返します。これは間違っていませんか?iterを試してみると、d_inputVector.begin()はゼロを返し、どこにも到達しません。

最後に、私の小さなプログラムの結果を得る私の方法は正しいですか?私はthrust::copyを使用してメモリをhost_vectorにコピーしますか?結果を表示するには、最後のようなループで十分ですか?

どんな提案でも大歓迎です。ありがとう、

mj

struct MemCmp
{
    __host__ __device__
    bool operator()(char *data)
    {
        bool rv = false;
        rv = true;

        return rv;
    }
};

....

// I initialize a device_vector and then copy pointers from main memory into the device_vector.
thrust::device_vector<char*> d_inputVector( itemCount );

for( int i=0; i<itemCount; i++ ){
    d_inputVector[i] = inputData[i];
}

thrust::device_vector<char*>::iterator iter;
iter = thrust::find_if( d_inputVector.begin(), d_inputVector.end(), MemCmp() );

    // this is the count that I think is wrong. 
count = d_inputVector.end() - iter; 

thrust::host_vector<char*> results( count );

thrust::copy( d_inputVector.begin(), iter, results.begin() );

for( thrust::host_vector<char *>::iterator it = results.begin(); it != results.end(); it++ ){
    char* foo = *it;
}
4

1 に答える 1

2

find_if一致するすべての文字列を見つけるのに適した関数ではありません。一致する最初の最初の要素を見つけるだけです。をご覧くださいcopy_if

まず、device_vector は文字列をメイン メモリから GPU メモリにコピーすることを「認識」していますか、それともポインタ値をコピーするだけですか?

GPU では意味のないポインター値になってしまいます。

C++ では、CPU で実行するにはstd::string、文字列を格納するために使用します。したがって、それはstd::vector<std::string>. のデバイス実装がないという事実によって問題が複雑にstringなるため、それらを GPU にコピーすることはできません。

さらに、多くの STL アルゴリズム (おそらくthrust. コンパイラは、基本的な型に対してそれらを提供しますが、char の配列に対しては提供しません。

したがって、CUDA/Trust を学ぶための単純な演習は、それほど単純ではない可能性があります。固定サイズの文字配列をカプセル化し、必要な演算子のデバイス関数を実装する C++ クラスが必要になると思います。

device_vectorまた、多くのアイテムを含むベクターをそのようにデバイス メモリに移動することは、ホストからデバイス メモリへの個別のコピーがバックグラウンドで実行されるため、非常に非効率的です。代わりに、 を入力してからhost_vectorを に割り当てます。次に、ホストからデバイス メモリへのコピーが 1 回だけ実行されます。host_vectordevice_vector

次に、「count = d_inputVector.end() - iter;」の行で これは、find_if の結果であるイテレータ内の項目数である 12 を返します。これは間違っていませんか?iter を試してみると、 d_inputVector.begin() はゼロを返し、どこにも行きません。

count = d_inputVector.begin() - iter;ベクトルの最初の要素が検索結果と一致するため、式は 0 を返す必要があります。

最後に、私の小さなプログラムの結果を取得する方法は正しいですか? Thrust::copy を使用してメモリを host_vector にコピーする必要がありますか?結果を表示するには、最後のループのようなループで十分でしょうか?

結果でを作成device_vectorしたら、それを に割り当ててhost_vector、1 回の操作でホスト メモリに移動します。

thrust::host_vector<char*> H = D;
于 2012-05-05T04:04:17.100 に答える