1

CUDA C プログラミング ガイドには、次のステートメントが記載されています。

カーネルの同時実行をサポートし、コンピューティング機能が 3.0 以下のデバイスの場合、ストリーミングされたカーネルの起動が完了しているかどうかを確認するために依存関係のチェックが必要な操作:

‣ CUDA コンテキスト内の任意のストリームから以前に起動されたすべてのカーネルのすべてのスレッド ブロックが実行を開始した場合にのみ、実行を開始できます。

‣ チェック中のカーネル起動が完了するまで、CUDA コンテキスト内の任意のストリームからの以降のカーネル起動をすべてブロックします。

私はここでかなり迷っています。依存関係チェックとは何ですか? 一部のデバイス メモリでのカーネル実行には、同じデバイス メモリを含む以前のすべてのカーネルまたはメモリ転送の依存関係チェックが必要であると言えますか? これが true の場合 (そうでない場合もあります)、この依存関係チェックは、上記のステートメントに従って他のストリームから以降のすべてのカーネルをブロックするため、その後非同期または同時実行は発生しませんが、これは正しくないようです。

説明や詳細をいただければ幸いです。

4

1 に答える 1

4

まず、nvidiaのウェビナー サイトにアクセスして、同時実行とストリームに関するウェビナーを視聴することをお勧めします。

さらに、次の点を考慮してください。

  • 同じストリームに発行されたコマンドは依存として扱われます

    たとえば、カーネルがアクセスするデータの memcopy の後にカーネルをストリームに挿入します。カーネルは、利用可能なデータに「依存」します。

  • したがって、同じストリーム内のコマンドは順次実行されることが保証されます(または同義語としてよく使用される同期)。
  • ただし、異なるストリームのコマンドは独立しており、同時に実行できます
  • したがって、依存関係はプログラマーだけが知っており、(エラーを避けるために) ストリームを使用して表現されます!

以下は、コンピューティング機能が 3.0 以下のデバイスにのみ対応します (quide に記載されているとおり)。コンピューティング機能 3.5 でのストリーム スケジューリング動作の変更について詳しく知りたい場合は、HyperQと対応するをご覧ください。この時点で、HyperQ の例を見つけたこのスレッドも参照したいと思います :)

2番目の質問について:「デバイスメモリでのカーネル実行」または「デバイスメモリを含むカーネル実行」の意味がよくわからないので、ステートメントを次のように減らしました。

カーネルの実行には、以前のすべてのカーネルとメモリ転送に対する依存関係のチェックが必要です。

より良いでしょう:

CUDA 操作では、同じストリーム内の前の CUDA 操作が完了したかどうかを確認するために、依存関係のチェックが必要です。

ここでの問題は、「実行を開始した」という表現にあると思います。つまり、すべてのカーネルが実行を開始し、十分なデバイス リソースが利用可能であれば、以前のカーネルと並行して、独立した (つまり、異なるストリームでの) カーネルの起動が可能です。

于 2013-04-30T17:33:53.773 に答える