はじめに
この本は、Webアプリケーション開発者のための、CPUとGPUの教科書です。 Rustのコードを入り口にして、コンピュータが実際にどう計算しているのかを、 ハードウェアの動きまで下りて理解することを目指します。
次のような読者を想定しています。
- Webアプリケーションの開発経験はあるが、CPUやGPUの内部にはあまり詳しくない
- Rustの主要な概念(所有権、トレイト、ジェネリクスなど)は把握しているが、 コンパイラが内部で何をしているかは知らない
- 「なぜこのコードは速いのか/遅いのか」を、雰囲気ではなく仕組みで説明できるようになりたい
Rustの文法そのものは解説しません。逆に、CPU・GPUについては前提知識ゼロから 説明します。専門用語は初出時に必ず説明し、巻末の用語集にもまとめてあります。
この本で何がわかるか
Section titled “この本で何がわかるか”読み終えると、次の質問に自分の言葉で答えられるようになります。
- CPUはプログラムをどうやって実行しているのか。キャッシュやパイプラインとは何か
- なぜ配列の走査は速く、連結リストの走査は遅いのか
- Rustコンパイラは、書いたコードをどんな機械語に変え、どう最適化しているのか
- 「ゼロコスト抽象化」はどこまで本当か。イテレータは本当にループと同じ速さなのか
- GPUはなぜ特定の計算だけ桁違いに速いのか。CPUとどう使い分けるべきか
- RustからGPUを動かすにはどうすればよいか
次の図は本書の全体の流れです。基礎編の3つのPartを順にたどり、 その先の応用編(Part IV〜VII)は関心のある章から読めます。
flowchart LR
subgraph p1 ["Part I CPUを知る"]
c1["1章 プログラムは
どう動くか"] --> c2["2章 メモリ階層"] --> c3["3章 パイプライン"] --> c4["4章 SIMD"] --> c5["5章 マルチコア"]
end
subgraph p2 ["Part II Rustと最適化"]
c6["6章 コンパイラ"] --> c7["7章 ゼロコスト
抽象化"] --> c8["8章 計測"]
end
subgraph p3 ["Part III GPUを知る"]
c9["9章 GPUの構造"] --> c10["10章 GPUのメモリ"] --> c11["11章 wgpu"] --> c12["12章 使い分け"]
end
p1 --> p2 --> p3
subgraph adv ["応用編 (関心のある章から)"]
p4["Part IV CPUとメモリの深層<br/>13〜17章"]
p5["Part V Rustの深層<br/>18〜22章"]
p6["Part VI GPUの深層<br/>23〜26章"]
p7["Part VII システムと実践<br/>27〜28章"]
end
p3 --> adv
本書は基礎編(Part I〜III)と応用編(Part IV〜VII)の2部構成です。
基礎編は、前提知識ゼロから最短経路で「仕組みで速度を説明できる」状態に 到達することを目指します。
- Part I(CPUを知る) — 機械語とレジスタから始めて、メモリ階層、パイプライン、 SIMD、マルチコアまで、現代のCPUの主要な仕組みを一つずつ見ていきます
- Part II(Rustと最適化) — Part Iの知識を土台に、Rustコンパイラがコードを どう機械語に変換し、最適化しているかを確かめる方法を学びます
- Part III(GPUを知る) — CPUとの対比でGPUの設計を理解し、 wgpuを使って実際にRustからGPUで計算します
応用編は、基礎編で意図的に省いた「体系を閉じるための柱」を扱います。 1つ1つは独立して読めますが、いずれも基礎編の理解を前提とします。
- Part IV(CPUとメモリの深層) — 数の表現、仮想メモリとTLB、 キャッシュの内部構造、CPUフロントエンド、メモリモデルの実装
- Part V(Rustの深層) — アロケータ、asyncの実体、unsafeとUB、 ビルドの制御、データ構造の実性能
- Part VI(GPUの深層) — カーネル最適化の体系、転送の隠蔽、 行列エンジンと混合精度、GPUの計測
- Part VII(システムと実践) — OSの層のコスト、実務での性能工学、 そして全体の知識地図
基礎編の各章は前の章の内容を前提にしているので、順に読むことを おすすめします。応用編は関心のある章から読んでかまいません。
コードをその場で実行できます
Section titled “コードをその場で実行できます”本文中のコードブロックの多くは、ブラウザ上でそのまま実行できます。 「▶ 実行」を押すと、Rust公式の実行環境(Rust Playground)に コードが送られ、コンパイルと実行の結果が表示されます。 「編集」を押せばコードを書き換えて試せます。
fn main() { // このコードはブラウザから実際に実行できます let answer = 6 * 7; println!("CPUが計算した答え: {answer}");}GPUを使う章のコードはブラウザでは実行できないため、手元で動かすための
完全なプロジェクトをリポジトリの examples/ ディレクトリに用意しています。
表記について
Section titled “表記について”- 説明のための数値(キャッシュ容量、レイテンシなど)は、断りがない限り 現代の一般的なCPU・GPUのおおよその値です。実際の値はハードウェアごとに異なります
- 「筆者の実測」とある値は、断りがなければRust Playground (共有のx86-64 Linux環境、stableのrustc、releaseビルド)での実測です。 「手元のMac」とあるものはApple M4(CPU 10コア、GPU 10コア、 ユニファイドメモリ)での実測です。共有環境の値は実行のたびにばらつきます
- コマンドの実行例は macOS / Linux のシェルを想定しています
- Rustのコードはエディション2024を前提としています
それでは、1章 プログラムはどう動くかから始めましょう。