CUDAの基礎

最終更新: 2023-12-20 00:50:48 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

CUDAは、汎用GPUコンピューティングのためのNVIDIAのプラットフォームです。CUDA C++は、GPU上で処理を起動するための構文をC++に拡張し、nvccコンパイラーがホストコンパイルとデバイスコードのコンパイルを調整します。これはC++を置き換える別の言語ではなく、NVIDIA GPUを中心に構築されたプログラミングモデルおよびツールチェーンです。

実行モデル #

ホストコードと呼ばれるCPUプログラムが、GPU上でカーネルを起動します。カーネルは多数の軽量スレッドを実行します。スレッドはブロックにまとめられ、ブロックはグリッドを形成します。1つのブロック内のスレッドは、高速な共有メモリと同期機構を通じて協調できます。一方、GPUがマルチプロセッサ間でスケジュールできるように、ブロックは独立して実行されるよう設計されています。

cpp
vector_add<<<grid_size, block_size>>>(a, b, result, count);

適切な起動次元、メモリアクセスパターン、転送コストは、算術演算と同じ程度に重要です。ホストとデバイスの間で少量のデータを繰り返し移動すると、GPU並列処理の利点が失われる可能性があります。

メモリと同期 #

グローバルメモリはすべてのスレッドから可視ですが、比較的レイテンシが高くなります。共有メモリはブロックにローカルであり、データの再利用に役立ちます。レジスタはスレッドごとにプライベートです。隣接するスレッドが近接したアドレスにアクセスする、結合されたグローバルメモリアクセスでは、通常スループットが向上します。

カーネルの起動は、デフォルトではホストに対して非同期です。CUDAエラーを確認し、結果が必要な場合にのみ同期してください。不要な同期は、CPU処理、転送、GPU実行のオーバーラップを減少させます。

マルチインスタンスGPU #

マルチインスタンスGPU(MIG)は、一部のNVIDIAデータセンターGPUアーキテクチャで利用できます。1つの物理GPUを、コンピュートおよびメモリリソースの専用部分を備えた、分離された複数のGPUインスタンスに分割します。CUDAアプリケーションからは、割り当てられたインスタンスが独立したデバイスとして認識されるため、通常のプロセス共有より強力なワークロード分離が可能になります。MIGのサポートと利用可能なプロファイルは、正確なGPUモデルとドライバースタックによって異なります。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)