GPU・製造・産業|Week 9

GPUの構造

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

画面のピクセルを一つずつ塗るより、似た作業を大勢で分担すると速い場面があるよ。
回路図タブレットを持ち、学習者を案内する半導体設計者の先生

この週でできるようになること

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

まず、具体的な場面から

64 threadを用意

warpサイズ32なら2 warpになる。

全threadが同じ処理

warp内の経路がそろう。

偶数と奇数で分岐

同じwarp内に2経路が混ざる。

見えてくること:GPUは多くのthreadをまとめ、待つwarpの代わりに別のwarpを進めて全体の処理量を高めます。

GPUの実行階層gridの中にblock、blockの中にwarp、warpの中にthreadが含まれる。 Grid Block Warp 丸1つがthread(図では4つだけ表示)
warpには通常32 threadが入ります。図の丸は省略して4つだけ描いています。

ここで初めて、見えてきた関係を言葉や記号でまとめます。

grid → block → warp → thread / SMは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内の分岐は?

  1. thread 0〜31 がwarp 0、32〜63 がwarp 1。
  2. warp 0 は全員が条件を満たし、warp 1 は全員が満たさない。
  3. 各warp内では経路がそろう。

答え:この条件ではwarp内ダイバージェンスは起きません。warp間の経路が違うこととは別です。

実習

CPU/GPU対話型ラボの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全体を何と呼ぶか。

    答えと考え方を見る

    grid。

  2. NVIDIAで通常32 threadをまとめる単位は何か。

    答えと考え方を見る

    warp。

  3. 同じblockのthreadが高速に共有できるオンチップメモリは何か。

    答えと考え方を見る

    shared memory(共有メモリ)。

  4. 同じwarpのthreadが異なる分岐経路へ進む現象を何というか。

    答えと考え方を見る

    分岐ダイバージェンス。

  5. メモリ待ちのwarpから別のwarpへ切り替える主な目的は何か。

    答えと考え方を見る

    あるwarpの待ち時間中に別warpを進め、演算器の空きを減らすため。