概要
- GPU の計算性能とメモリ帯域の違いによるボトルネックの解説
- メモリバウンド と コンピュートバウンド の2つの性能領域
- 演算強度(Arithmetic Intensity) による最適化指標
- 性能向上の基本戦略: 演算融合(Fusion) と タイル化(Tiling)
- A100 アーキテクチャを例に、階層構造や最適化手法を図解
GPUの計算・メモリ階層と性能ボトルネック
- GPUは 計算速度 が非常に高い一方で、 メインメモリ(VRAM) へのアクセス速度が相対的に遅い構造
- 例: NVIDIA A100 は32bit演算で 19.5 TFLOPS、メモリ帯域は 1.5 TB/s
- グローバルメモリ(VRAM) は大容量だが遅く、全データはここに格納
- ストリーミングマルチプロセッサ(SM) が計算単位、各SMに 高速なオンチップSRAM(共有メモリ) と レジスタ を搭載
- スレッドは ワープ(32スレッド) 単位で同時実行、 ブロック (最大1024スレッド)がSM上で動作、ブロック内で共有メモリを利用
2つの性能領域:メモリバウンドとコンピュートバウンド
- カーネル (GPUで並列実行される関数)は、 メモリ帯域 または 計算能力 のいずれかで性能が制限
- メモリバウンド :データ転送速度がボトルネック(例:要素ごとの加算)
- コンピュートバウンド :演算速度がボトルネック(例:大規模行列積)
- 演算強度(AI)= 総FLOPs / 総バイトアクセス で性能領域を判別
- Rooflineモデル :AIと性能の関係を図示、2つの「屋根(roof)」で物理的上限を示す
- AI ≈ 13 FLOPs/Byte がA100の分岐点(リッジポイント)
- AIが低いとメモリバウンド、高いとコンピュートバウンド
- 最適化目標は AIを高めて コンピュートバウンド領域に到達させること
行列積のAI向上戦略
- 単純実装 (1スレッドが1要素計算):AIは 0.25 FLOPs/Byte と低く、メモリバウンド
- 2x2タイル計算 :AIは 0.5 FLOPs/Byte に増加するが、依然として低い
- 共有メモリの活用 でスレッドブロック全体がデータを協調的に再利用し、AIを大幅に向上
- 1024スレッドのブロックで AI > 13 を実現可能
第三のボトルネック:オーバーヘッド
- CPU側の準備・カーネル起動遅延 がボトルネックとなる場合(小規模・高頻度のカーネル実行時)
- 非同期実行 や バッチ化 で隠蔽可能
- 本記事ではカーネルが十分大きい前提で、主にメモリ・計算ボトルネックに注目
性能向上の基本戦略:FusionとTiling
- 演算融合(Fusion) :複数の単純操作を1つのカーネルにまとめ、中間メモリアクセスを削減
- 例:
y = relu(x + 1)を別々に実行せず、1カーネルで同時処理
- 例:
- タイル化(Tiling) :複雑な処理(例:行列積)でデータの再利用性を最大化し、AIを向上
- 共有メモリ に大きなタイルをロードし、スレッド間で協調的に演算
まとめ
- GPU最適化 の本質は、 限られたメモリ帯域 を最大限に活用し、 AIを高めて コンピュートバウンド領域へ移行すること
- Fusion で中間メモリ転送を減らし、 Tiling でデータ再利用性を高めることが重要
- A100 など最新GPUでは、 共有メモリ や ワープ 構造を意識した設計が高性能化の鍵
この内容は、GPUアーキテクチャや最適化の基礎を理解し、実際のカーネル設計やパフォーマンスチューニングに役立つ知識体系としてまとめられています。