-1

良いリファレンスガイドはほとんどありませんが、それでもスレッドとブロックの制限に混乱しています。1)基本的な質問:構成の実行におけるグリッドあたりのブロック数、つまり、グリッドはすべてのSMまたは単一のSMを消費しますか?

2)実際には、コンピューティング機能に従って、SMごとに8ブロックを使用できると言われていますが、なぜ時々、各次元で65535ブロックを構成できると言われているのでしょうか。8つのブロックが並行して実行されることは理解しましたが、65535ブロックを構成するにはどうすればよいでしょうか?それらはSMごとですか、それともグリッドごとですか?

3)総数 計算能力に応じたスレッドの数は1024/ブロックおよび1536/SMであり、各次元の2Dの場合、最大数はいくつですか。同時にいくつのスレッドを作成できますか?さらに構成した場合は、順番にいくつ作成できますか?合計は1024以内である必要がありますか?実際に確認しましたが、ブロックごとの制限を超えてスレッドを構成している場合がありますが、それでも機能していますが、なぜそうなのですか?3a)ケースa:GT200の場合、30個のSMがあり、各SMは最大8個のブロックを持つことができるため、合計240個のブロック(すべてのSMを考慮)があると結論付けられます。各ディメンションで構成できますか?3b)ケースb:また、私のプログラムの1つで、マトリックスの入力サイズは10,000 x 10,000であり、次の構成を実行しました。グリッドあたりのブロック数:1-いいえ。ブロックあたりのスレッド数:10,000、いいえ、それはまだ機能していました。ブロックあたりのスレッド数が制限を超えていますが、まだ機能しています。なぜ機能していたのか説明してもらえますか?そして、どの方法でスレッドとブロックが実行されますか?働く、

4

1 に答える 1

1
  1. はい、カーネルの起動に関連付けられたグリッドは、GPU内のSMのいずれかまたはすべてを使用できます。これはGPUのハードウェアスケジューリングロジックによって処理されるため、詳細については気にする必要はありません。GPUは、スループットを最大化するために、使用可能なSMでブロックを最適にスケジュールしようとします。
  2. SMにフィードするキューには、実行準備のさまざまな段階にあるブロックを含めることができます。SMあたり8ブロックとは、SMのワープスケジューラがこれらの8ブロックのいずれかからワープを選択していつでも実行できるという考え方を指します。より多くのブロックをキューに入れることができますが、それらの前のブロックの一部がリタイアされるまで、ワープをアクティブに実行する可能性はありません。もちろん、SMごとに8ブロック以上を起動することができます。SMが使用可能になると(つまり、ブロックが廃止されるとSMの実行スロットが解放されるため)、これらは単にキューに入れられて実行を待機します。すべてのSMの実行スロットに最大8ブロックが入ると、グリッド内の残りのブロックは次のようになります。これらの実行スロットが解放されるのを待っています。
  3. グリッドあたりのスレッドの総数は、明確に定義された数ではありません。これは主に、指定または定義された数ではなく、オンチップ上のハードウェア/リソースの制限の問題です。もちろん、ブロックあたりの最大スレッド数は明確に定義されています。確かに、1回のグリッド起動で数億のスレッドを処理できます。おそらくそれ以上です。ただし、65535 * 65535ブロック(2D)のグリッドを構成しようとすると、各ブロックに1024スレッド(任意の配置)が含まれるため、カーネルの起動に失敗する可能性があります。ただし、1つの次元で65535ブロックを取得し、他の次元(3Dグリッドの場合は他の2つの次元)でより少ない数を取得することはできます。
  4. (3a。)はい、GT200には30のSMがあります。各SMがすぐに実行できるキューで8ブロックを処理できる場合、それは240ブロックです。ただし、GPUの別のキューにあり、実行を待機しているブロックをさらに多く持つことができます。彼らは実行スロットが開くのを待っています。スロットが開くと、待機キューから出て、特定のSMに割り当てられます。したがって、グリッド(カーネルの起動に関連付けられているすべてのブロック)には、240を超えるブロックを含めることができます。
  5. (3b。)ブロックあたりのスレッドサイズが10000のカーネルを起動しようとすると、失敗します。あなたは例を提供していないのであなたのケースを説明することはできません、あなたは単に「それはうまくいく」と言っただけです。申し訳ありませんが、動作しませ。短く、完全で、コンパイル可能な例を提供してください。そうすれば、誰かがエラーを表示します。たとえば、この方法でカーネルを起動するときにエラーチェックを行っていますか?
于 2012-11-19T22:18:40.387 に答える