はじめに
この本は、Webアプリケーション開発者のための、CPUとGPUの教科書です。 Rustのコードを題材にして、コンピュータが実際にどう計算しているのかを、 ハードウェアの動作のレベルまで理解することを目指します。
対象読者
本書は、Webアプリケーションの開発経験があり、CPUやGPUの内部構造には 詳しくない読者を想定しています。Rustについては、所有権、トレイト、 ジェネリクスなどの主要な概念を把握している一方で、コンパイラが内部で 何をしているかは知らない、という水準を前提にします。 「なぜこのコードは速いのか、遅いのか」を、印象ではなく仕組みで 説明できるようになることが本書の目標です。
CPU・GPUについては前提知識ゼロから説明しますが、Rustの文法そのものは 解説しません。専門用語は初出時に必ず説明し、巻末の用語集にもまとめてあります。
この本で何がわかるか
読み終えると、次のことができるようになります。
- CPUがプログラムを実行する仕組みと、キャッシュやパイプラインの役割を説明できます
- 配列の走査が速く、連結リストの走査が遅い理由を説明できます
- Rustコンパイラが、書いたコードをどんな機械語に変え、どう最適化しているかを確認できます
- 「ゼロコスト抽象化」がどこまで成り立つか、イテレータがループと同じ速さかを計測で確かめられます
- GPUが特定の計算だけ大幅に速い理由を説明し、CPUとの使い分けを判断できます
- RustからGPUを動かせます
構成
次の図は本書の全体の流れです。基礎編の3つのPartを順にたどり、 その先の応用編(Part IV〜VII)は関心のある章から読めます。
本書は基礎編(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章 プログラムはどう動くかに進んでください。