GPUの構造
たくさんのスレッドをwarp・blockへまとめる仕組みと、分岐の影響を学びます。

この週でできるようになること
- GPUがグラフィックスから大量並列計算へ発展した理由を説明できる。
- thread、warp、block、grid、SMの包含関係を描ける。
- SIMDとSIMTの違いを初学者向けに説明できる。
- CPUコア数とGPUの演算器数を直接比較できない理由を説明できる。
まず、具体的な場面から
warpサイズ32なら2 warpになる。
warp内の経路がそろう。
同じwarp内に2経路が混ざる。
見えてくること:GPUは多くのthreadをまとめ、待つwarpの代わりに別のwarpを進めて全体の処理量を高めます。
ここで初めて、見えてきた関係を言葉や記号でまとめます。
threadは論理的な実行単位、warpは通常32 threadの集団、blockは同期・共有メモリを使える集団、gridは1回のkernel起動全体です。
なぜそうなる?
同じ種類の命令をまとめて発行できると、たくさんの要素に演算を適用しやすくなります。あるwarpがメモリを待っている間に別のwarpを進めます。
講義ノートで詳しく読む
元のMarkdownにある仕組み・図・用語を、順番に確認します。
1. グラフィックスと並列性
画面には多数の頂点やピクセルがあります。各ピクセルの色計算には共通する処理が多く、別のピクセルとの依存が比較的少ないため、大量の演算器で並列に処理できます。
典型的な描画の概念:
3D頂点
↓ 座標変換(vertex処理)
三角形
↓ rasterize
ピクセル候補
↓ 色・光・texture計算(fragment/pixel処理)
画面
この「同じ種類の計算を大量データへ適用する」性質を一般計算へ広げたものがGPGPUです。
2. CPUとGPUの資源配分
CPUは一つの命令列を速く進めるため、大きなキャッシュ、分岐予測、アウト・オブ・オーダー制御などへ多くの回路を使います。
GPUは多数の演算を同時に進めるため、より多くの演算器、レジスタ、高帯域メモリ接続へ資源を使います。各スレッドの単独性能より、全体の仕事量を重視します。
3. CUDAの実行階層
Grid(1回のkernel起動)
├─ Block 0
│ ├─ Warp 0: thread 0~31
│ └─ Warp 1: thread 32~63
├─ Block 1
│ ├─ Warp 0
│ └─ Warp 1
└─ ...
GPU
├─ SM 0:複数block/warpを保持・実行
├─ SM 1
└─ ...
- thread:一つのデータ要素などを担当する論理的実行単位。
- warp:NVIDIA GPUがまとめて命令発行する通常32スレッドの集団。
- block:同じSM上で実行され、同期や共有メモリを使えるthread集団。
- grid:一つのkernel起動に含まれる全block。
- SM:warpをスケジュールし、演算器・レジスタ・共有メモリを提供する単位。
block数がSM数より多くても問題ありません。空いたSMへ順次blockが割り当てられます。そのため同じプログラムを規模の異なるGPUで実行できます。
4. SIMDとSIMT
SIMD
一つの命令が複数のデータ要素へ同じ演算を明示的に適用します。CPUのベクトル命令にも使われます。
[a0 a1 a2 a3] + [b0 b1 b2 b3]
SIMT
プログラマーは多数のthreadを記述しますが、ハードウェアは複数threadをwarpとしてまとめて実行します。threadごとに番号とレジスタ状態を持ちます。
SIMTはプログラミング上threadとして見せつつ、ハードウェア側で同型命令をまとめる考え方です。
5. warpスケジューリング
メモリ待ちなどでwarp Aがすぐ進めないとき、SMは準備のできたwarp Bへ命令を発行できます。多数のwarpを常駐させ、待ち時間を別の仕事で隠します。
切替を軽くするため、常駐threadのレジスタ状態はSM内に保持されます。しかし一つのthreadが使うレジスタや共有メモリが多すぎると、同時に常駐できるwarp数が減ります。
6. 分岐ダイバージェンス
同じwarp内で一部threadがif側、残りがelse側へ進む場合、経路を別々に実行し、対象外threadを一時的に無効化することがあります。
if (thread_id % 2 == 0) A();
else B();
warpの半分:A
warpの半分:B
→ AとBを順に処理するため効率低下
分岐が存在するだけで必ず遅いわけではありません。warp内で全threadが同じ側ならダイバージェンスは起きません。
7. NVIDIAとAMDの用語
NVIDIAのSMとAMDのCUは、どちらもGPU内の主要な演算・スケジューリング資源のまとまりを指す際に比較されます。ただし内部構造、実行幅、用語、世代差があるため同一物として数を直接比較しません。
例題で確かめる
64 threadを1 blockに入れ、warpサイズ32。thread_id < 32 で分岐するとwarp内の分岐は?
- thread 0〜31 がwarp 0、32〜63 がwarp 1。
- warp 0 は全員が条件を満たし、warp 1 は全員が満たさない。
- 各warp内では経路がそろう。
答え:この条件ではwarp内ダイバージェンスは起きません。warp間の経路が違うこととは別です。
実習
CPU/GPU対話型ラボのGPUタブを使います。
- 64 thread、warp size 32としてwarpを2個作る。
- 全threadが同じ経路を通る場合のactive lane数を数える。
- 偶数threadだけA、奇数threadだけBへ進む場合を表示する。
thread_id < 32で分岐する場合と比較する。- 「分岐条件をデータ配置でそろえる」効果を文章にする。
説明課題
CPUの8コアとGPUの数千の演算器を、数だけで比べられない理由を説明してください。
練習問題
元ノートの小テストです。まず自分で答えを考え、必要なら下の答えを開いてください。
一回のkernel起動に含まれるblock全体を何と呼ぶか。
答えと考え方を見る
grid。
NVIDIAで通常32 threadをまとめる単位は何か。
答えと考え方を見る
warp。
同じblockのthreadが高速に共有できるオンチップメモリは何か。
答えと考え方を見る
shared memory(共有メモリ)。
同じwarpのthreadが異なる分岐経路へ進む現象を何というか。
答えと考え方を見る
分岐ダイバージェンス。
メモリ待ちのwarpから別のwarpへ切り替える主な目的は何か。
答えと考え方を見る
あるwarpの待ち時間中に別warpを進め、演算器の空きを減らすため。