おしぼりの日常

低レイヤが好きです.

「プログラマーのための CPU 入門 ― CPUは如何にしてソフトウェアを高速に実行するか」を読んだ

年明けの暇な時間を利用して読んでみました。

書籍のリンク

技術書としての感想

良かった点

  • とにかく文章が分かりやすい
  • 色々な用語の使い方に違和感がない

言葉にすると簡単ですが、本当に分かりやすかったです.

  • 具体例が豊富
  • 図が豊富
  • コード例が豊富
  • 実験例が豊富

まず、「〇〇 な場合に命令の処理が詰まって遅くなります」といった説明の後に、「では、具体的にこういったケースを考えてみましょう」という具体例を持ってくる展開が多く、とても親切だと感じました.また、このような具体例の説明のときにほぼ必ず図が用いられています.特に全体を通して頻繁に出てくる命令流の図は非常に分かりやすかったです.また、コード例とそれを用いた実験も豊富でした.具体的には、キャシュの章では実際にキャッシュミスを意図的に起こすコード・キャッシュヒットを意図的に起こすコードをそれぞれ実行してどれくらい速くなったか、などを確認できます.実際に理解した CPU の機構により速度が変わることを体感できたことで、理解度が深まった気がします.

  • 構成に一貫性がある

この辺りも個人的にはかなり良かったです.特に各章は、

  1. CPU における高速化のための仕組み
  2. その仕組みがうまく機能しないケース・むしろ速度に悪影響を与えるケース
  3. ハードウェア・ソフトウェアによる緩和策
  4. まとめ

という構成でほぼ一貫しており、非常に読みやすかったです.

  • 難易度が丁度良い
  • より専門的な書籍や論文を読む足がかりになる

難易度もかなり丁度良く、普段 CPU を意識しない Web 寄りのソフトウェアエンジニア 〜 低レイヤ寄りのソフトウェアエンジニアあたりまでの人は読むとかなり学びがあるのではないでしょうか?自作 OS をしている人は 6 章 〜 8 章あたりの内容(仮想記憶、I/O、システムコール、例外、割り込み)は既に知っている内容も多いと思いますが、これらの仕組みを CPU の処理速度への影響という観点からまとめあげているため、依然として多くの学びがあると思います.例えば「TLB ミスと割り込みや例外による CPU の速度低下ってどっちの方が深刻なんだろう?」とか「パイプライン化などの高速化の機構により得られる恩恵と無駄な I/O を減らすことにより得られる恩恵ってどっちが大きいんだろう?」などの疑問に対する自分なりの答えが見つかるようなイメージです.自作 OS などは基本的には速度面を気にして設計・実装まですることはないと思うので、このような観点から知っている内容を復習できた点も個人的には嬉しかったです.

せっかく色々と学んだので、ここで得た知識で論文が読めるのか、を試してみました(参考).結果としては、かなりハードルの低い内容ではあったものの、今までの自分ではまず理解できなかったであろう内容を理解できました.このことから、より専門的な内容を知るために必要な内容が無駄なく詰め込まれていたのだな、と非常に感心しました.

悪かった点

個人的には無い

注意点

ソフトウェアを高速化するための具体的な技法みたいな部分にはあまり期待しない方が良いかもしれない。当たり前ですが、CPU 側の高速化技術に焦点を当てた書籍だからです。書籍内で紹介されている CPU レベルでの高速化技法は、ソフトウェア実装側からは操作できなかったり、意図的に使えたとしても高速化を達成するのが相当に難しかったりするからです。ただ、各章には「ソフトウェアによる緩和」という節が設けられており、一応こんなこともできるよ、というのは書かれています。

総評

めっちゃ良かった