GPUとシェーダ — 数千コアが画素を同時に塗る
4K画面は約830万画素。リアルタイムCGはそれを毎秒60回以上塗り直します。1画素ずつ順番に計算していては絶対に間に合わない — だから「同じ計算を大量のデータへ一斉にかける」ことに特化した機械、GPUが生まれました。並列の威力と、その上で走る小さなプログラムシェーダを、動かして体感します。
1. なぜGPUは速いのか — 塗り競争で見る並列の力
絵作りの最終工程は「画素ごとに色をひとつ計算する」ことです。フルHDで約207万、4Kで約830万画素。60fpsなら毎秒約5億回の色計算になります。
CPUは少数精鋭 — 高クロック・分岐予測・巨大キャッシュを備えた高機能コアを数個〜十数個持ち、複雑で逐次的な処理が得意です。対してGPUは、単純な計算器を数百〜数千個並べます。画素の色計算は互いに独立なので、何万個に分割しても正しさが変わらない。だから「全員で同時に」が効くのです。下のデモで、1コアは速いが数が少ないCPUチームと、1コアは遅いが大人数のGPUチームに同じ絵を塗らせてみましょう。
2. 絵ができる流れ — グラフィックスパイプライン
GPUの内部は流れ作業(パイプライン)です。頂点シェーダは頂点ごとに座標変換(レッスン2〜3の行列計算)を実行するプログラム。ラスタライザは三角形を画素の候補「フラグメント」に分解する固定機能回路(レッスン5)。フラグメントシェーダはフラグメントごとにライティングやテクスチャ(レッスン7〜8)で色を決めるプログラムです。
緑の箱がプログラム可能な段 — ここに開発者が自由なコードを書けることが、現代CGの表現力の源です。
3. フラグメントシェーダ — 全画素に同じ関数
フラグメントシェーダの正体は、画素の位置 (u, v) などを受け取って色を返す関数です。画面のすべての画素で「同じ関数」が同時に実行され、違うのは入力だけ。つまり関数を1つ書けば画面全体の模様が決まります。プリセットを切り替えて、その感覚をつかんでください。
4. SIMTと分岐ダイバージェンス — 数千スレッドの操縦法
数千のスレッドを1本ずつ独立に制御すると、制御回路だけでチップが埋まってしまいます。そこでGPUはスレッドを32本程度の束(NVIDIAはワープ、AMDは wavefront と呼ぶ)にまとめ、束の中の全レーンが同じ命令を一斉に実行します。この方式が SIMT(Single Instruction, Multiple Threads)です。
問題は if です。束の中で条件の真偽が割れると、GPUは両方の枝を順番に実行し、関係ないレーンをマスク(無効化)して待たせます。これが分岐ダイバージェンス — 並列機の隠れた弱点です。
5. まとめ
- GPUの本質はデータ並列:画素・頂点のような「独立した大量の仕事」に、単純なコアの物量で挑む。
- パイプライン:頂点シェーダ(プログラム可能)→ ラスタライザ(固定機能)→ フラグメントシェーダ(プログラム可能)の流れ作業。
- シェーダ=全データに同時適用される関数:フラグメントシェーダは (u, v) から色への関数。1つの関数が画面全体を決める。
- SIMTと分岐ダイバージェンス:32本束で同じ命令を実行するため、束内で分岐が割れると両方の枝を直列実行して遅くなる。