18

計算能力 2.x 以上の NVIDIA gpu は、最大 16 個のカーネルを同時に実行できることを知っています。ただし、私のアプリケーションは 7 つの「プロセス」を生成し、これら 7 つのプロセスのそれぞれが CUDA カーネルを起動します。

私の最初の質問は、これらのカーネルの予想される動作はどうなるかということです。それらも同時に実行されますか、それとも異なるプロセスによって起動されるため、順次実行されますか。

CUDA C プログラミング ガイドに次のように記載されているため、私は混乱しています。

「ある CUDA コンテキストのカーネルは、別の CUDA コンテキストのカーネルと同時に実行できません。」これにより、2 番目の質問になります。CUDA の「コンテキスト」とは何ですか?

ありがとう!

4

3 に答える 3

21

CUDA コンテキストは、ホスト スレッドまたはプロセスが所有するコードとデータを保持する仮想実行空間です。現在のすべてのハードウェアを備えた GPU でアクティブにできるコンテキストは 1 つだけです。

したがって、最初の質問に答えるために、コンテキストを確立して同じ GPU で同時に実行しようとする 7 つの個別のスレッドまたはプロセスがある場合、それらはシリアル化され、GPU へのアクセスを待機しているプロセスは、実行中のコンテキストが得られます。私の知る限りでは、タイム スライスはなく、スケジューリング ヒューリスティックは文書化されておらず、オペレーティング システムごとに統一されていません (私は疑っています)。

GPU コンテキストを保持する単一のワーカー スレッドを起動し、他のスレッドからのメッセージングを使用して作業を GPU にプッシュすることをお勧めします。別の方法として、CUDA ドライバー API で使用できるコンテキスト移行機能がありますが、これは同じプロセスのスレッドでのみ機能し、移行メカニズムには待ち時間とホスト CPU のオーバーヘッドがあります。

于 2013-02-15T14:34:36.823 に答える
0

個別のスレッドとコンテキストが本当に必要ですか? 1 つの GPU で複数のコンテキストを使用すると十分なオーバーヘッドが生じるため、ベスト プラクティスは GPU ごとに 1 つのコンテキストを使用することだと思います。

多くのカーネルを同時に実行するには、1 つの CUDA コンテキストでいくつかの CUDA ストリームを作成し、各カーネルを独自のストリームにキューイングする必要があります。これにより、十分なリソースがあれば、それらは同時に実行されます。

いくつかの CPU スレッドからコンテキストにアクセスできるようにする必要がある場合は、cuCtxPopCurrent()、cuCtxPushCurrent() を使用してそれらを渡すことができますが、コンテキストを操作できるスレッドは常に 1 つだけです。

于 2013-02-15T14:54:16.077 に答える