CUDAプログラミングガイド
開発者がNVIDIA GPU上で実行される高性能なコードを書くためのCUDAプログラミングモデルを学ぶための公式で包括的なリソース。このガイドでは、プラットフォームアーキテクチャ、プログラミングインターフェース、高度なハードウェア機能、および技術仕様についてカバーしています。
レッスン
コース概要
📚 コンテンツ概要
開発者向けの公式で包括的なリソース。NVIDIA GPU上で実行される高性能コードを書くためのCUDAプログラミングモデルについて学ぶことができます。このガイドでは、プラットフォームアーキテクチャ、プログラミングインターフェース、高度なハードウェア機能、技術仕様についてカバーしています。
業界標準のガイドにより、並列計算の芸術を習得しましょう。NVIDIA CUDA
著者: NVIDIA Corporation
謝辞: Copyright © 2007-2024 NVIDIA Corporation および関連会社。すべての権利を保有。
🎯 学習目標
- 異種システムにおけるホスト(CPU)とデバイス(GPU)の役割を定義する。
- SIMTプログラミングモデルとスレッド、ブロック、グリッドの階層的構造を説明する。
- PTX(Parallel Thread Execution)とバイナリコード(cubins)の違いを区別し、ジャストインタイム(JIT)コンパイルが互換性を促進する仕組みを説明する。
- CUDAカーネルの開発とコンパイル:__global__関数の記述、三重矢印表記による実行設定、NVCCコンパイルワークフローの管理。
- メモリとデータ移動の最適化:ユニファイドメモリ、明示的メモリ、マップドメモリのモデルの違いを理解し、効率的な転送のためにページロックされたホストメモリを実装する。
- 並列実行の管理:CUDAストリーム、イベント、コオペラティブグループを使用して非同期タスクを管理し、CPU-GPU間の同期を行う。
- 複雑なポインタ演算を行い、アーキテクチャ上のボトルネック(ヴァン・ノイマン型対ハーバード型)を特定する。
- 高度なCUDA実行パターンを実装する。プログラムによる依存カーネル起動や異種バッチメモリ転送を含む。
- スレッドスコープ、非同期プロキシ、パイプラインといったハードウェア固有の機能を活用し、並行性を最大化する。
- プリフェッチ、使用ヒント、ページサイズ管理を用いてユニファイドメモリのパフォーマンスを設定・チューニングする。
🔹 レッスン1:CUDAの基礎とアーキテクチャ概要
概要: このレッスンでは、CUDA並列コンピューティングプラットフォームとその基盤となるハードウェアアーキテクチャについて紹介します。異種システムがCPUとGPUをどのように活用するか、SIMT(Single Instruction, Multiple Threads)プログラミングモデル、スレッド、ブロック、グリッドの階層構造について学びます。また、PTX、cubins、fatbinsの役割を含む、CUDAコンパイルワークフローもカバーします。これにより、バイナリ互換性と将来への順応性が確保されます。
学習成果:
- 異種システムにおけるホスト(CPU)とデバイス(GPU)の役割を定義する。
- SIMTプログラミングモデルとスレッド、ブロック、グリッドの階層的組織を説明する。
- PTX(Parallel Thread Execution)とバイナリコード(cubins)の違いを区別し、ジャストインタイム(JIT)コンパイルが互換性を促進する仕組みを説明する。
🔹 レッスン2:核心となるGPUプログラミングと実行管理
概要: このレッスンでは、CUDA C++を用いたGPUプログラミングの基本から高度なトピックまでをカバーします。基本的なカーネル定義とNVCCコンパイルワークフローから始まり、複雑な実行管理に関する話題に進みます。具体的には、SIMTカーネル設計、共有メモリバンク競合、ストリームとイベントを用いた非同期実行などです。学生はユニファイドメモリと明示的メモリのバランスを取る方法を学び、高性能コンピューティング向けにハードウェアの占有率を最適化するスキルを身につけます。
学習成果:
- CUDAカーネルの開発とコンパイル:__global__関数の記述、三重矢印表記による実行設定、NVCCコンパイルワークフローの管理。
- メモリとデータ移動の最適化:ユニファイド、明示的、マップドメモリモデルの違いを理解し、効率的な転送のためにページロックされたホストメモリを実装する。
- 並列実行の管理:CUDAストリーム、イベント、コオペラティブグループを使用して非同期タスクを管理し、CPU-GPU間の同期を実現する。
🔹 レッスン3:高度なメモリ論理とマルチGPUシステム
概要: このレッスンでは、基本的なメモリアーキテクチャとポインタ論理から、高度なGPU加速技術へと移行します。ハードウェアレベルの実行モデル(SIMT、独立スレッドスケジューリング)、高度な同期メカニズム(非同期バリア、スコープ付きアトミック操作)、そしてランタイムAPIとドライバAPIを併用したマルチGPUシステムの調整について学びます。
学習成果:
- 複雑なポインタ演算を行い、アーキテクチャ上のボトルネック(ヴァン・ノイマン型対ハーバード型)を特定する。
- プログラムによる依存カーネル起動や異種バッチメモリ転送を含む、高度なCUDA実行パターンを実装する。
- スレッドスコープ、非同期プロキシ、パイプラインといったハードウェア固有の機能を活用し、並行性を最大化する。
🔹 レッスン4:最適化、グラフ、ハードウェアアクセラレータ
概要: このレッスンでは、高性能CUDAプログラミングのテクニックに焦点を当て、データ移動と実行フローの最適化について解説します。ストリームベースの実行から継続的CUDAグラフへの移行、プリフェッチとヒントによるユニファイドメモリの細かい制御、およびテンソルメモリアクセラレータ(TMA)やL2キャッシュの永続性といったハードウェア特有のアクセラレータの活用についても取り上げます。さらに、高度な同期パターン、グリーンコンテキストによるリソースパーティショニング、現代の異種コンピューティング向けのクロスAPI相互運用性について詳述します。
学習成果:
- プリフェッチ、使用ヒント、ページサイズ管理を用いてユニファイドメモリのパフォーマンスを設定・チューニングする。
- CUDAグラフの構築、更新、実行(メモリノードおよびデバイス側起動の利用を含む)を行う。
- 非同期バリアとプロデューサー・コンシューマーパターンを用いた高度な同期を実装する。
🔹 レッスン5:技術リファレンスと言語拡張
概要: このレッスンでは、CUDAプログラミングモデルの参照仕様およびC++言語拡張について深く掘り下げます。コンピュート能力を通じたハードウェア-ソフトウェアインターフェース、ランタイム制御のための環境変数、最新のC++標準を活用した高性能デバイスコードの記述に必要な特定の構文要件について学びます。協働グループや専用ハードウェアイントリシンスの使用も含まれます。
学習成果:
- GPUのコンピュート能力バージョンに基づいて、ハードウェアの制約や機能セットを特定する。
- システムレベルの環境変数を用いて、CUDA実行環境とJITコンパイルを設定する。
- デバイス側の制限に従いながら、C++言語拡張(アノテーション、ラムダ式、テンプレート)を適用する。