(非同期) SIMT アーキテクチャ
CUDA プログラミング モデルでは、スレッドは計算またはメモリ操作の最低レベルの抽象化です。NVIDIA Ampere GPU アーキテクチャに基づくデバイスから始めて、CUDA プログラミング モデルは、非同期プログラミング モデルを通じてメモリ操作の高速化を提供します。非同期プログラミング モデルは、CUDA スレッドに関する非同期操作の動作を定義します。
非同期プログラミング モデルは、CUDA スレッド間の同期のための非同期。このモデルは、GPUcuda::memcpy_async
での。
非同期操作
非同期操作は、CUDA スレッドによって開始され、他のスレッドと同様に非同期で実行される操作として定義されます。適切に構造化されたプログラムでは、1 つ以上の CUDA スレッドが非同期操作と同期します。非同期操作を開始する CUDA スレッドは、同期スレッドである必要はありません。
このような非同期スレッド (as-if スレッド) は、非同期操作を開始した CUDA スレッドに常に関連付けられます。非同期操作は、同期オブジェクトを使用して操作の完了を同期します。このような同期オブジェクトは、ユーザーが明示的に管理することも (例: cuda::memcpy_async
)、ライブラリで暗黙的に管理することもできます (例: cooperative_groups::memcpy_async
)。
同期オブジェクトはcuda::barrier
またはcuda::pipeline
。これらのオブジェクトの詳細については、 cuda::pipeline を使用した非同期バリアと非同期データ コピーを参照してください。これらの同期オブジェクトは、さまざまなスレッド スコープで使用できます。スコープは、同期オブジェクトを使用して非同期操作と同期できる一連のスレッドを定義します。
次の表は、CUDA C++ で使用できるスレッド スコープと、各スレッドと同期できるスレッドを定義しています。
スレッドスコープ | 説明 |
---|---|
cuda::thread_scope::thread_scope_thread | 非同期操作を開始した CUDA スレッドのみが同期します。 |
cuda::thread_scope::thread_scope_block | 開始スレッドが同期するのと同じスレッド ブロック内のすべてまたは任意の CUDA スレッド。 |
cuda::thread_scope::thread_scope_device | 開始スレッドと同じ GPU デバイス内のすべてまたは任意の CUDA スレッドが同期します。 |
cuda::thread_scope::thread_scope_system | 開始スレッドと同じシステム内のすべてまたは任意の CUDA または CPU スレッドが同期します。 |
これらのスレッド スコープは、標準 C++ の拡張機能として CUDA 標準 C++ ライブラリに実装されています。