RustではじめるCPUとGPU

はじめに

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

対象読者

本書は、Webアプリケーションの開発経験があり、CPUやGPUの内部構造には 詳しくない読者を想定しています。Rustについては、所有権、トレイト、 ジェネリクスなどの主要な概念を把握している一方で、コンパイラが内部で 何をしているかは知らない、という水準を前提にします。 「なぜこのコードは速いのか、遅いのか」を、印象ではなく仕組みで 説明できるようになることが本書の目標です。

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

この本で何がわかるか

読み終えると、次のことができるようになります。

  • CPUがプログラムを実行する仕組みと、キャッシュやパイプラインの役割を説明できます
  • 配列の走査が速く、連結リストの走査が遅い理由を説明できます
  • Rustコンパイラが、書いたコードをどんな機械語に変え、どう最適化しているかを確認できます
  • 「ゼロコスト抽象化」がどこまで成り立つか、イテレータがループと同じ速さかを計測で確かめられます
  • GPUが特定の計算だけ大幅に速い理由を説明し、CPUとの使い分けを判断できます
  • RustからGPUを動かせます

構成

次の図は本書の全体の流れです。基礎編の3つのPartを順にたどり、 その先の応用編(Part IV〜VII)は関心のある章から読めます。

応用編 (関心のある章から)

Part IV CPUとメモリの深層
13〜17章

Part V Rustの深層
18〜22章

Part VI GPUの深層
23〜26章

Part VII システムと実践
27〜28章

Part III GPUを知る

9章 GPUの構造

10章 GPUのメモリ

11章 wgpu

12章 使い分け

Part II Rustと最適化

6章 コンパイラ

7章 ゼロコスト
抽象化

8章 計測

Part I CPUを知る

1章 プログラムは
どう動くか

2章 メモリ階層

3章 パイプライン

4章 SIMD

5章 マルチコア

本書は基礎編(Part I〜III)と応用編(Part IV〜VII)の2部構成です。

基礎編は、前提知識ゼロから最短経路で「仕組みで速度を説明できる」状態に 到達することを目指します。

  • Part I(CPUを知る): 機械語とレジスタから始めて、メモリ階層、パイプライン、 SIMD、マルチコアまで、現代のCPUの主要な仕組みを1つずつ説明します
  • Part II(Rustと最適化): Part Iの知識を前提に、Rustコンパイラがコードを どう機械語に変換し、最適化しているかを確かめる方法を学びます
  • Part III(GPUを知る): CPUとの対比でGPUの設計を理解し、 wgpuを使って実際にRustからGPUで計算します

応用編は、基礎編で意図的に省いた、体系を完成させるために必要な主題を扱います。 各章は独立して読めますが、いずれも基礎編の理解を前提とします。

  • Part IV(CPUとメモリの深層): 数の表現、仮想メモリとTLB、 キャッシュの内部構造、CPUフロントエンド、メモリモデルの実装を扱います
  • Part V(Rustの深層): アロケータ、asyncの実体、unsafeとUB、 ビルドの制御、データ構造の実性能を扱います
  • Part VI(GPUの深層): カーネル最適化の体系、転送の隠蔽、 行列エンジンと混合精度、GPUの計測を扱います
  • Part VII(システムと実践): OSの層のコスト、実務での性能工学、 そして本書全体の知識の一覧を扱います

基礎編の各章は前の章の内容を前提にしているので、順に読むことを おすすめします。応用編は関心のある章から読んでかまいません。

コードをその場で実行できます

本文中のコードブロックの多くは、ブラウザ上でそのまま実行できます。 「▶ 実行」を押すと、Rust公式の実行環境(Rust Playground)に コードが送られ、コンパイルと実行の結果が表示されます。 「編集」を押せばコードを書き換えて試せます。

fn main() {
    // このコードはブラウザから実際に実行できます
    let answer = 6 * 7;
    println!("CPUが計算した答え: {answer}");
}

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

表記について

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

1章 プログラムはどう動くかに進んでください。