24

CUDA コアを含む CUDA GPU にマルチプロセッサがあることを知っています。私の職場では、512 個の CUDA コア、16 個のマルチプロセッサを含み、ワープ サイズが 32 の GTX 590 を使用しています。つまり、これは、各マルチプロセッサに 32 個の CUDA コアがあり、同じワープの同じコードで正確に動作することを意味します。 . 最後に、ブロック サイズあたりの最大スレッド数は 1024 です。

私の質問は、ブロック サイズとマルチプロセッサ カウント - ワープ サイズがどのように正確に関連しているかです。状況についての私の理解を教えてください: たとえば、GTX 590 で最大 threadPerBlock サイズが 1024 の N ブロックを割り当てます。CUDA プログラミング ガイドおよび他のソースから理解する限り、ブロックは最初にハードウェアによって列挙されます。 . この場合、N 個のブロックのうち 16 個が異なるマルチプロセッサに割り当てられます。各ブロックには 1024 のスレッドが含まれ、ハードウェア スケジューラはこれらのスレッドのうち 32 を単一のマルチプロセッサの 32 のコアに割り当てます。同じマルチプロセッサ (ワープ) 内のスレッドは、コードの同じ行を処理し、現在のマルチプロセッサの共有メモリを使用します。現在の 32 個のスレッドがメモリの読み取り/書き込みなどのオフチップ操作に遭遇した場合、それらは、現在のブロックからの 32 個のスレッドの別のグループに置き換えられます。したがって、実際には 1 つのブロックに 32 のスレッドがあり、最後に、ブロックがマルチプロセッサによって完全に処理されると、N 個のスレッド ブロックのリストから新しいスレッド ブロックが現在のマルチプロセッサにプラグインされます最後に、CUDA カーネルの実行中に、合計 512 のスレッドが GPU で並行して実行されます。(ブロックが 1 つのマルチプロセッサで使用できるよりも多くのレジスタを使用する場合、2 つのマルチプロセッサで動作するように分割されることはわかっていますが、この場合、各ブロックが 1 つのマルチプロセッサに収まると仮定します。)

では、CUDA 並列実行のモデルは正しいのでしょうか? そうでない場合、何が間違っているか、または不足していますか? 現在取り組んでいるプロジェクトを微調整したいので、全体の中で最も正確な作業モデルが必要です。

4

1 に答える 1

19

私の職場では、512 個の CUDA コア、16 個のマルチプロセッサを含み、ワープ サイズが 32 の GTX 590 を使用しています。つまり、これは、各マルチプロセッサに 32 個の CUDA コアがあり、同じワープの同じコードで正確に動作することを意味します。 . 最後に、ブロック サイズあたりの最大スレッド数は 1024 です。

GTX590 には、カードに 2 つの GPU があるため、言及した数値の 2 倍が含まれています。以下では、1 つのチップに焦点を当てます。

状況についての私の理解を教えてください: たとえば、GTX 590 で最大 threadPerBlock サイズが 1024 の N ブロックを割り当てます。CUDA プログラミング ガイドおよび他のソースから理解する限り、ブロックは最初にハードウェアによって列挙されます。 . この場合、N 個のブロックのうち 16 個が異なるマルチプロセッサに割り当てられます。

ブロックは、必ずしもマルチプロセッサ (SM) 間で均等に分散されるとは限りません。ちょうど 16 ブロックをスケジュールすると、いくつかの SM が 2 つまたは 3 つのブロックを取得でき、そのうちのいくつかはアイドル状態になります。どうしてか分かりません。

各ブロックには 1024 のスレッドが含まれ、ハードウェア スケジューラはこれらのスレッドのうち 32 を単一のマルチプロセッサの 32 のコアに割り当てます。

スレッドとコアの関係はそれほど直接的ではありません。各 SM には 32 個の「基本」ALU があります。単精度浮動小数点およびほとんどの 32 ビット整数および論理命令などを処理するもの。ただし、ロード/ストア ユニットは 16 個しかないため、現在処理中のワープ命令がロード/ストアの場合は、2 回スケジュールする必要があります。また、三角法などを行う特殊機能ユニットは 4 つだけです。したがって、これらの命令は 32 / 4 = 8 回スケジュールする必要があります。

同じマルチプロセッサ (ワープ) 内のスレッドは、コードの同じ行を処理し、現在のマルチプロセッサの共有メモリを使用します。

いいえ、1 つの SM で同時に「実行中」のスレッドが 32 を超える可能性があります。

現在の 32 スレッドがメモリの読み取り/書き込みなどのオフチップ操作に遭遇した場合、現在のブロックの 32 スレッドの別のグループに置き換えられます。したがって、実際には 1 つのブロックに 32 のスレッドがあり、1024 のスレッド全体ではなく、マルチプロセッサ上で常に正確に並列に実行されます。

いいえ、ワープが入れ替わるのはメモリー操作だけではありません。ALU も深くパイプライン化されているため、まだパイプラインにある値に対してデータの依存関係が発生すると、新しいワープがスワップインされます。そのため、コードに 2 つの命令が含まれ、2 番目の命令が最初の命令の出力を使用する場合、最初の命令の値がパイプラインを通過する間、ワープは保留されます。

最後に、ブロックがマルチプロセッサによって完全に処理されると、N 個のスレッド ブロックのリストから新しいスレッド ブロックが現在のマルチプロセッサにプラグインされます。

マルチプロセッサは一度に複数のブロックを処理できますが、ブロックは、処理が開始されると別の MP に移動できません。現在実行中のブロック内のスレッドの数は、ブロックが使用するリソースの数によって異なります。CUDA Occupancy Calculator は、特定のカーネルのリソース使用量に基づいて、同時に処理中のブロックの数を示します。

最後に、CUDA カーネルの実行中に、合計 512 のスレッドが GPU で並行して実行されます。(ブロックが 1 つのマルチプロセッサで使用できるよりも多くのレジスタを使用する場合、2 つのマルチプロセッサで動作するように分割されることはわかっていますが、この場合、各ブロックが 1 つのマルチプロセッサに収まると仮定します。)

いいえ、ブロックを分割して 2 つのマルチプロセッサで動作させることはできません。ブロック全体は、常に単一のマルチプロセッサによって処理されます。特定のマルチプロセッサに、カーネルで少なくとも 1 つのブロックを処理するのに十分なリソースがない場合、カーネル起動エラーが発生し、プログラムはまったく実行されません。

スレッドを「実行中」と定義する方法によって異なります。通常、GPU には 512 を超えるスレッドがあり、チップ上のさまざまなリソースを同時に消費します。

この質問の @harrism の回答を参照してください: CUDA: 合計で同時スレッド数は?

于 2012-07-19T16:52:39.007 に答える