1 つのストリームで 1000 スレッドの 10 ブロックでカーネルを実行してデータの配列を分析し、次に 1000 スレッドの 10 ブロックを必要とするカーネルを起動して別のストリームで別の配列を分析するとどうなるか疑問に思っていました。起こる?
カードの非アクティブなスレッドは、2 番目のアレイの分析プロセスを開始しますか? または、最初のストリームが終了する必要があるまで、2 番目のストリームが一時停止されますか?
ありがとうございました。
1 つのストリームで 1000 スレッドの 10 ブロックでカーネルを実行してデータの配列を分析し、次に 1000 スレッドの 10 ブロックを必要とするカーネルを起動して別のストリームで別の配列を分析するとどうなるか疑問に思っていました。起こる?
カードの非アクティブなスレッドは、2 番目のアレイの分析プロセスを開始しますか? または、最初のストリームが終了する必要があるまで、2 番目のストリームが一時停止されますか?
ありがとうございました。
一般的に言えば、カーネルが同じアプリケーションの異なる (デフォルト以外の) ストリームから発行され、並行カーネルの実行に関するすべての要件が満たされ、利用可能なリソースが十分にある場合 (特に SM -- これは、両方のカーネルをスケジュールするために「非アクティブなスレッド」を意味します)、2 番目のカーネルのブロックのいくつかは、既に実行されている最初のカーネルのブロックと一緒に実行を開始します。これは、最初のカーネルのブロックが既にスケジュールされているのと同じ SM で発生するか、他の占有されていない SM で発生するか、またはその両方で発生する可能性があります (たとえば、GPU に 14 個の SM がある場合、作業ディストリビューターは 10 個のブロックを配布します) 10 個の SM の最初のカーネルで、その時点で未使用の 4 個が残ります。)
一方、カーネルに 32KB の共有メモリ使用量を必要とするスレッドブロックがあり、GPU に 8 つの SM がある場合、最初のカーネルのスレッドブロックは 8 つの SM を効果的に「使い果たし」、2 番目のカーネルのスレッドブロックは使用されません。最初のカーネルのスレッドブロックの一部が「排出」されるまで実行を開始します。つまり、完了して廃止されます。これは、同時実行を阻害する可能性のあるリソース使用率の一例にすぎません。もちろん、それぞれに多数のスレッドブロック (たとえば 100 以上) を持つカーネルを起動した場合、最初のカーネルがほとんどマシンを占有し、2 番目のカーネルは最初のカーネルがほぼ終了するまで実行を開始しません。
右上隅で「cuda 並行カーネル」を検索すると、並行カーネル実行の観察に関連するいくつかの課題を強調するいくつかの質問が見つかります。