📖

「プログラマーのための CPU 入門」を読みました

2023/01/28に公開

https://www.lambdanote.com/products/cpu

本書の構成

第1章。「ふむふむ、このレベルから説明してくれるのか」
第2章の途中からギアアップしてきて、「スーパースカラ+スーパーパイプライン化」で現代のCPUの規模感のようなものを思い知ることになります。順調にCPUの中を流れる命令列はまるでナイアガラの滝のよう。
でもちょっとしたことでその流れは止まってしまい、そのペナルティの大きさを実感することになります。
第3章から第8章で、CPUの処理の流れを止めるさまざまな要因が語られていきます。

第9章は「マルチプロセッサ」。一段と複雑になる要因ですが、現代のCPUでは外せないもの。
第10章から第12章で、共有メモリ型マルチプロセッサでのマルチスレッドをするときの注意点が語られていきます。
第13章がまとめ。それ以降は付録です。

私としては第9章の「マルチプロセッサ」以降が非常に勉強になりました。ぼんやりとしかわかってなかったことがこれでクリアになりました。

各章ごとに実際に計測してみるサンプルがあるのがとても良いと思いました。書かれている数値的な情報は言いっぱなしではなくて、実際に確認する方法が示されているわけです。素晴らしいです。

常識のアップデートが必要

私は1980年代からソフトウェアの開発に関わっています。時代と共に前提となる条件が変わってきました。

  • シングルスレッド
  • シングルプロセッサでのマルチスレッド
  • 共有メモリ型マルチプロセッサでのマルチスレッド

自分のかかわった組み込み開発の世界では2000年代中頃まではシングルプロセッサが当然でした。2010年代では共有メモリ型マルチプロセッサを考慮しなくてはならなくなって難易度が上がりました。

1990年代だったら、遅いところを「アセンブラで書き直す」というのが選択肢としてあったわけですが、その頃はシングルプロセッサが前提でした。現代では共有メモリ型マルチプロセッサでのマルチスレッド環境が前提となるわけですが、アセンブラで書き直すことはバグの混入のリスクが高まるのでむしろ悪手であるといえそうです。しかもそのバグはめったに再現しないという最も解決が難しい種類のバグです。

第11章「メモリの順序付け」では、まとめのところにこのように書かれています。

ソフトウェア開発においては、性能対策よりも、まずはソフトウェアとして正しく
動作させることを優先すべきです。そのうえで性能対策が必要になる場合には、プロ
グラミング環境が提供する抽象度の高いプリミティブを用いることを推奨します。

要するに、アセンブラで直接メモリバリア命令を扱うようなコードは書くのは避けろということです。

マルチプロセッサで並列度を上げたプログラミングをしやすいという点でGo言語はかなりいいなあと思いました。
goroutineとchannelで抽象化された並行処理を記述できます。Linux以上のリッチな環境でガベージコレクタを使用しても良いという前提条件がつきますが。

本書をおすすめしたい人

タイトル通り、全てのプログラマーにおすすめしたいです。現代ではアセンブラで書く機会はほぼないし、本当に限られた人以外はその必要性もありません。でも知識として本書に書かれていることは知っておいてほしいなと思いました。前半部分だけでもいいから読んで!

関連

昔、仮想記憶について話をしました。
http://blog.kmckk.com/archives/4354489.html

https://zenn.dev/tetsu_koba/articles/732279afbb1759
https://zenn.dev/tetsu_koba/articles/5cfb55b4002851

Discussion