2012-05-06 20 views
1

申し訳ありませんが、私はC++とCudaを勉強しています。これが可能かどうかを知りたいので、関連するセクションにもっと集中できます。CUDAは独自の作業キューを処理できますか?

私の問題は非常に並列化が可能で、実際には現在複数のサーバーで実行しています。何もしない(データを破棄し

  • 、(それを保存)したデータを保持する

    1. :私のプログラムでは、作業項目(非常に小さなリスト)を取得し、その上にループを実行し、3つの決断の一つになります何をすべきかのその不明さらに
    2. プロセスデータ(、)それをので、データを変更し、処理するためにキューにそれを再送する。

    この

  • は再帰であることが使用されるが、私は、各部分が独立して行われ、私は1CPU分の時間が長くなりますが、その悪影響は前後に渡るメッセージがたくさんあることです。 CUDAがどのように動作するのか、どのように作業を提出するのかを高いレベルで説明しますが、CUDAがデバイス自体のキューを管理することは可能ですか?

    私の現在の思考プロセスは、C++ホスト上のキューを管理し、処理をデバイスに送信した後、結果がホストに返され、デバイスに返送されます(など)。私はそれがうまくいくと思っていますが、CUDAメモリ自体にキューを持たせることができ、カーネルが作業をして直接作業を送信できるかどうかを見たいと思っていました。

    これはCUDAで可能なのでしょうか、これを行う良い方法がありますか?

    +0

    [C++で作業キューを管理するために使用できる埋め込みライブラリはありますか?](http://stackoverflow.com/questions/10464838/is-there-a-embedded-library-i-can -use-to-manage-a-work-queue-in-c) – talonmies

    答えて

    1

    あなたがデバイスに中間結果を保存できるかどうかはあなたが尋ねていると思います。その答えは「はい」です。つまり、新しい作業項目をデバイスにコピーし、完了したアイテムのみをデバイスからコピーする必要があります。依然として未定義の作業項目は、カーネル呼び出しの間に装置に残ります。

    これについては、CUDA Thrustを参照してください。推力には変換のための効率的なアルゴリズムがあり、これはカスタムロジックと組み合わせることができます(推論マニュアルの "カーネル融合"を検索してください)。あなたの処理は変換と見なすことができます。 2つの新しいベクトル、保持するアイテムの1つ、まだ未定のアイテムの1つです。

    ホストはデバイス上のメモリを認識していますか(または監視できますか)?私の懸念事項は、GPUオンボードメモリを超えて始まるデータを認識して対処する方法です。

    カーネル内からメモリを割り当てて解放することは可能ですが、効率的ではないでしょう。代わりに、cudaMalloc()cudaFree()などのCUDAコールを実行してメモリを管理するか、Thrustを使用している場合はカーネルコール間でベクトルを作成またはサイズ変更してください。

    この「手動」メモリ管理では、cudaMemGetInfo()で使用したメモリ量を把握できます。

    完了した作業項目をホストに戻すと、デバイスに残っている作業項目の数がわかるため、カーネル呼び出しで必要となる可能性のある最大メモリー量は何か分かります。

    各トランスフォームのソースとデスティネーションのベクトルを入れ替えることをお勧めします。簡単な例を挙げると、複数のステップでフィルター処理する一連の作業項目があるとします。ベクトルAを作成し、それを作業項目で埋めます。次に、同じサイズのベクトルBを作成し、それを空のままにします。フィルタリングの後、Aの作業項目の一部がBに移動され、その数がカウントされます。今度はフィルターをもう一度実行します。今回はBをソース、Aを宛先として使用します。

    +0

    これは非常にエキサイティングなことです。あなたの答えは関連する質問を引き起こしました。ホストはデバイスのメモリを認識していますか(または監視できますか)。私の懸念事項は、GPUオンボードメモリを超えて始まるデータを認識して対処する方法です。 –

    +1

    答えにいくつかの注釈を追加しました。 –

    関連する問題