web-dev-qa-db-ja.com

ストリーミングマルチプロセッサ、ブロック、スレッド(CUDA)

CUDAコア、ストリーミングマルチプロセッサ、およびブロックとスレッドのCUDAモデルの関係は何ですか?

何が何にマッピングされ、何がどのように並列化されますか?そして、より効率的なものは、ブロック数またはスレッド数を最大化しますか?


私の現在の理解では、マルチプロセッサあたり8個のcudaコアがあります。すべてのcudaコアが一度に1つのcudaブロックを実行できること。そのブロック内のすべてのスレッドは、その特定のコアでシリアルに実行されます。

これは正しいです?

64
ExtremeCoder

スレッド/ブロックレイアウトの詳細については、 CUDAプログラミングガイド をご覧ください。特に、第4章では次のように述べています。

CUDAアーキテクチャは、マルチスレッドストリーミングマルチプロセッサ(SM)のスケーラブルな配列を中心に構築されています。ホストCPU上のCUDAプログラムがカーネルグリッドを呼び出すと、グリッドのブロックが列挙され、利用可能な実行容量を持つマルチプロセッサーに配布されます。スレッドブロックのスレッドは1つのマルチプロセッサで同時に実行され、複数のスレッドブロックは1つのマルチプロセッサで同時に実行できます。スレッドブロックが終了すると、空のマルチプロセッサで新しいブロックが起動されます。

各SMには8つのCUDAコアが含まれており、一度に32スレッドの単一のワープを実行しているため、ワープ全体に対して単一の命令を発行するには4クロックサイクルかかります。任意のワープのスレッドはロックステップで実行されると想定できますが、ワープ間で同期するには、__syncthreads()を使用する必要があります。

61
Edric

GTX 970には、それぞれ128個のCuda Coreを備えた13個のストリーミングマルチプロセッサ(SM)があります。 Cuda CoreはStream Processor(SP)とも呼ばれます。

ブロックをGPUにマップするグリッドを定義できます。

スレッドをストリームプロセッサ(SMごとに128個のCuda Core)にマップするブロックを定義できます。

1つのワープは常に32個のスレッドによって形成され、ワー​​プのすべてのスレッドは同時に実行されます。

GPUの最大限の能力を使用するには、SMにSPがあるよりも多くのスレッドがSMごとに必要です。各計算機能には、一度に1つのSMに常駐できる特定の数のスレッドがあります。定義したすべてのブロックはキューに入れられ、SMがリソース(空きSP数)を持つのを待ってからロードされます。 SMはWarpsの実行を開始します。 1つのワープには32個のスレッドしかなく、SMにはたとえば128個のSPがあるため、SMは特定の時間に4個のワープを実行できます。問題は、スレッドがメモリアクセスを行う場合、そのメモリ要求が満たされるまでスレッドがブロックすることです。数字で:SPの算術計算には18-22サイクルのレイテンシがありますが、キャッシュされていないグローバルメモリアクセスには最大300-400サイクルかかる可能性があります。ワープは、128 SPのサブセットのみが機能するデータを待機しています。また、ブロックサイズによって占有率が決定されます(SMが実行できるワープの数から)占有率が高い場合、SPに作業がないことはほとんどありません。

各cudaコアが一度に1つのブロックを実行するというステートメントは間違っています。ストリーミングマルチプロセッサについて話すと、SMにあるすべてのスレッドからワープを実行できます。 1つのブロックのサイズが256スレッドであり、GPUがSMごとに2048スレッドを常駐させる場合、各SMには、SMが実行するワープを選択できる8つのブロックがあります。実行されたワープのすべてのスレッドは並行して実行されます。

さまざまなコンピューティング機能とGPUアーキテクチャの数値は、ここにあります: https://en.wikipedia.org/wiki/CUDA#Limitations

Nvidia Occupancy Calculation sheet(by Nvidia) から占有計算シートをダウンロードできます。

32
JoeFox

Compute Work Distributorは、SMにスレッドブロックに十分なリソース(共有メモリ、ワープ、レジスタ、バリアなど)がある場合にのみ、SMでスレッドブロック(CTA)をスケジュールします。共有メモリなどのスレッドブロックレベルのリソースが割り当てられます。割り当ては、スレッドブロック内のすべてのスレッドに十分なワープを作成します。リソースマネージャは、SMサブパーティションに ラウンドロビン を使用してワープを割り当てます。各SMサブパーティションには、ワープスケジューラ、レジスタファイル、および実行ユニットが含まれています。ワープがサブパーティションに割り当てられると、完了するまで、またはコンテキストスイッチによってプリエンプトされるまで、サブパーティションに残ります(Pascalアーキテクチャ)。コンテキストスイッチの復元では、ワープは同じSM同じwarp-idに復元されます。

ワープのすべてのスレッドが完了すると、ワープスケジューラは、ワープによって発行されたすべての未解決の命令が完了するまで待機し、リソースマネージャーは、ワープIDとレジスタファイルを含むワープレベルリソースを解放します。

スレッドブロック内のすべてのワープが完了すると、ブロックレベルのリソースが解放され、SMはCompute Work Distributorにブロックが完了したことを通知します。

ワープがサブパーティションに割り当てられ、すべてのリソースが割り当てられると、ワープはアクティブと見なされます。これは、ワープスケジューラがワープの状態をアクティブに追跡していることを意味します。各サイクルで、ワープスケジューラは、どのアクティブワープがストールしており、どのワープが命令を発行する資格があるかを決定します。ワープスケジューラは、優先度が最も高い適格なワープを選択し、ワープから1〜2回連続して命令を発行します。二重発行のルールは、各アーキテクチャに固有です。ワープがメモリロードを発行する場合、依存命令に到達するまで独立した命令を実行し続けることができます。ワープは、ロードが完了するまで停止を報告します。同じことは、依存する数学命令にも当てはまります。 SMアーキテクチャは、ワープ間のサイクルごとに切り替えることにより、ALUとメモリレイテンシの両方を隠すように設計されています。

この答えは、CUDAコアという用語を使用しません。これは、誤ったメンタルモデルを導入するためです。 CUDAコアは、パイプライン化された単精度浮動小数点/整数実行ユニットです。発行率と依存関係の遅延は、各アーキテクチャに固有です。各SMサブパーティションとSMには、ロード/ストアユニット、倍精度浮動小数点ユニット、半精度浮動小数点ユニット、分岐ユニットなど、他の実行ユニットがあります。

パフォーマンスを最大化するために、開発者はブロック対ワープ対レジスタ/スレッドのトレードオフを理解する必要があります。

占有率という用語は、SMのアクティブワープと最大ワープの比率です。 Kepler-Pascalアーキテクチャ(GP100を除く)には、SMごとに4つのワープスケジューラがあります。 SMごとのワープの最小数は、少なくともワープスケジューラの数と等しくなければなりません。アーキテクチャの依存する実行レイテンシが6サイクル(MaxwellおよびPascal)の場合、レイテンシをカバーするには、スケジューラごとに少なくとも6ワープ、SMあたり24(24/64 = 37.5%占有)が必要です。スレッドに命令レベルの並列性がある場合、これを減らすことができます。ほとんどすべてのカーネルは、80〜1000サイクルかかるメモリロードなどの可変レイテンシ命令を発行します。これには、待機時間を隠すために、ワープスケジューラごとによりアクティブなワープが必要です。各カーネルには、ワープの数と共有メモリやレジスタなどの他のリソースとの間にトレードオフポイントがあるため、100%の占有率を最適化することはお勧めできません。 CUDAプロファイラーは、開発者がそのバランスを判断するのを支援するために、命令発行率、占有率、およびストール理由を特定するのに役立ちます。

スレッドブロックのサイズは、パフォーマンスに影響を与える可能性があります。カーネルに大きなブロックがあり、同期バリアを使用している場合、バリアストールがストールの原因になる可能性があります。これは、スレッドブロックごとの反りを減らすことで軽減できます。

5
Greg Smith

1つのデバイスに複数のストリーミングマルチプロセッサがあります。
SMには複数のブロックが含まれる場合があります。各ブロックには複数のスレッドが含まれる場合があります。
。 SMは常にスレッドのワープに取り組んでいます(常に32)。ワープは、同じブロックのスレッドでのみ機能します。
SMとブロックの両方には、スレッド数、レジスター数、共有メモリー数に制限があります。

0
liu km