2

この方法でストリームを作成しました:

cudaStream_t stream0;
cudaStream_t stream1;
cudaStreamCreate( &stream0);
cudaStreamCreate( &stream1);

次のようなカーネル関数を実行します

singlecore<<<1,1>>>(devL2,1000);
singlecore<<<1,1,0,stream0>>>(devL2,1000);

2 つのカーネルは現在実行されていません。しかし、最初のカーネルを次のように実行するstream1と:

singlecore<<<1,1,0,stream1>>>(devL2,1000);
singlecore<<<1,1,0,stream0>>>(devL2,1000);

それらは現在実行されます。

デフォルトストリームのカーネル関数は現在実行できないのでしょうか。

4

2 に答える 2

7

はい、デフォルト ストリームに対して発行される cuda コマンドには制限があります。暗黙的な同期に関する C プログラミング ガイドのセクションを参照してください。

"次の操作のいずれかがホスト スレッドによって間に発行された場合、異なるストリームからの 2 つのコマンドを同時に実行することはできません: ... •デフォルト ストリームへの任意の CUDA コマンド"

そのため、一般的な経験則として、重複するコピー操作と計算操作については、そのようなすべての操作を一連の非デフォルト ストリームでプログラムするのが最も簡単です。デフォルト ストリーム (および他のストリーム) で発行されたコマンドとオーバーラップする可能性のある抜け穴 (あなたが発見した) が少しありますが、デフォルト ストリームと他のストリームの間の制限についても注意深く理解する必要があります。コマンドを発行する順序に注意してください。良い例は、C プログラミング ガイドで説明されています。「オーバーラップ動作」のセクションを最後まで読んでください。

最初の例では、デフォルト ストリームに発行されたカーネルは、他のストリームに発行されたカーネルの実行をブロックします。2 番目の例では、デフォルト以外のストリームに発行されたカーネルがデフォルト ストリームに発行されたカーネルの実行をブロックしないため、同時実行性を確保できます。

于 2012-11-11T14:44:17.867 に答える