コンテンツにスキップ

はじめに

この本は、Webアプリケーション開発者のための、CPUとGPUの教科書です。 Rustのコードを入り口にして、コンピュータが実際にどう計算しているのかを、 ハードウェアの動きまで下りて理解することを目指します。

次のような読者を想定しています。

  • Webアプリケーションの開発経験はあるが、CPUやGPUの内部にはあまり詳しくない
  • Rustの主要な概念(所有権、トレイト、ジェネリクスなど)は把握しているが、 コンパイラが内部で何をしているかは知らない
  • 「なぜこのコードは速いのか/遅いのか」を、雰囲気ではなく仕組みで説明できるようになりたい

Rustの文法そのものは解説しません。逆に、CPU・GPUについては前提知識ゼロから 説明します。専門用語は初出時に必ず説明し、巻末の用語集にもまとめてあります。

読み終えると、次の質問に自分の言葉で答えられるようになります。

  • 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}");
}
stable / debugPlaygroundで開く ↗

GPUを使う章のコードはブラウザでは実行できないため、手元で動かすための 完全なプロジェクトをリポジトリの examples/ ディレクトリに用意しています。

  • 説明のための数値(キャッシュ容量、レイテンシなど)は、断りがない限り 現代の一般的なCPU・GPUのおおよその値です。実際の値はハードウェアごとに異なります
  • 「筆者の実測」とある値は、断りがなければRust Playground (共有のx86-64 Linux環境、stableのrustc、releaseビルド)での実測です。 「手元のMac」とあるものはApple M4(CPU 10コア、GPU 10コア、 ユニファイドメモリ)での実測です。共有環境の値は実行のたびにばらつきます
  • コマンドの実行例は macOS / Linux のシェルを想定しています
  • Rustのコードはエディション2024を前提としています

それでは、1章 プログラムはどう動くかから始めましょう。