web-dev-qa-db-ja.com

CUDA-マルチプロセッサ、ワープサイズ、ブロックあたりの最大スレッド数:正確な関係は何ですか?

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

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

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

24
Ufuk Can Bicici

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

カードには2つのGPUがあるため、GTX590には前述の2倍の数が含まれています。以下では、シングルチップに焦点を当てます。

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

ブロックは、必ずしもマルチプロセッサ(SM)全体に均等に分散されるとは限りません。正確に16ブロックをスケジュールすると、一部のSMは2または3ブロックを取得でき、一部のSMはアイドル状態になります。理由はわかりません。

各ブロックには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占有計算機は、特定のカーネルのリソース使用量に基づいて、同時に飛行するブロックの数を示します。

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

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

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

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

19
Roger Dahl