# Week 9：GPUの構造

## 今週のゴール

- GPUがグラフィックスから大量並列計算へ発展した理由を説明できる。
- thread、warp、block、grid、SMの包含関係を描ける。
- SIMDとSIMTの違いを初学者向けに説明できる。
- CPUコア数とGPUの演算器数を直接比較できない理由を説明できる。

## 1. グラフィックスと並列性

画面には多数の頂点やピクセルがあります。各ピクセルの色計算には共通する処理が多く、別のピクセルとの依存が比較的少ないため、大量の演算器で並列に処理できます。

典型的な描画の概念：

```text
3D頂点
  ↓ 座標変換（vertex処理）
三角形
  ↓ rasterize
ピクセル候補
  ↓ 色・光・texture計算（fragment/pixel処理）
画面
```

この「同じ種類の計算を大量データへ適用する」性質を一般計算へ広げたものがGPGPUです。

## 2. CPUとGPUの資源配分

CPUは一つの命令列を速く進めるため、大きなキャッシュ、分岐予測、アウト・オブ・オーダー制御などへ多くの回路を使います。

GPUは多数の演算を同時に進めるため、より多くの演算器、レジスタ、高帯域メモリ接続へ資源を使います。各スレッドの単独性能より、全体の仕事量を重視します。

## 3. CUDAの実行階層

```text
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のベクトル命令にも使われます。

```text
[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を一時的に無効化することがあります。

```text
if (thread_id % 2 == 0) A();
else                     B();

warpの半分：A
warpの半分：B
→ AとBを順に処理するため効率低下
```

分岐が存在するだけで必ず遅いわけではありません。warp内で全threadが同じ側ならダイバージェンスは起きません。

## 7. NVIDIAとAMDの用語

NVIDIAのSMとAMDのCUは、どちらもGPU内の主要な演算・スケジューリング資源のまとまりを指す際に比較されます。ただし内部構造、実行幅、用語、世代差があるため同一物として数を直接比較しません。

## 実習

[CPU/GPU対話型ラボ](../labs/cpu_gpu_lab.html)のGPUタブを使います。

1. 64 thread、warp size 32としてwarpを2個作る。
2. 全threadが同じ経路を通る場合のactive lane数を数える。
3. 偶数threadだけA、奇数threadだけBへ進む場合を表示する。
4. `thread_id < 32` で分岐する場合と比較する。
5. 「分岐条件をデータ配置でそろえる」効果を文章にする。

## 説明課題

CPUの8コアとGPUの数千の演算器を、数だけで比べられない理由を説明してください。

## 小テスト

1. 一回のkernel起動に含まれるblock全体を何と呼ぶか。
2. NVIDIAで通常32 threadをまとめる単位は何か。
3. 同じblockのthreadが高速に共有できるオンチップメモリは何か。
4. 同じwarpのthreadが異なる分岐経路へ進む現象を何というか。
5. メモリ待ちのwarpから別のwarpへ切り替える主な目的は何か。

[解答](../answers.md#week-9)

