フューチャー技術ブログ

プログラマーのためのCPU入門

image.png

読書感想文連載 4冊目のエントリーです。なんか最近、積読が増えてきてしまったなーと思い、社内に読書連載しましょうよ、と投げたところ若い人も含めてぱぱっとすぐに人が集まってこのような連載ができて、良い会社に育っている!と思っているところです。集まるのが早すぎて本を急いで読む必要があって大変だったぐらいです。

で、僕が選びたかった本は、A Philosophy of Software Designだったり、遠くへ行きたければ、みんなで行けだったり、たくさんあったのですが、とりあえずスタックの一番上に積まれていたプログラマーのためのCPU入門を読みました。

CPUは地味に早くなっている

僕が中学の、初めてパソコンを買った時は、お店で発売されている機種がi486 DX4(100MHz)から、i386 SX(16MHz)まで、上から下までの差が激しい時代でした。またパソコンも高かったので中古で買ったり、部室のパソコンは先輩のお下がり(それこそ5年以上落ち)という状況で、現役マシンの差が4MHzあたりから100MHzで数10倍は周波数が違うという感じでした。その後はどんどん周波数が上がり、大学のころにはAMDとインテルが競争して、1GHzを超えたと思ったらPentium 4の3.8GHzまで周波数はどんどん伸びていきました。また、ハイパースレッディングとか、デュアルコアとか性能もどんどん伸びていました。

その後は、ムーアの法則は終わりだ、と言われたりして、周波数は頭打ちになりました。最近になってブースト時は6GHzを公式に超えるようになりましたが、3GHzから6GHzまでは20年かかっています。クロック周波数自体はずっと2GHzとか3GHzあたりをずっと行ったり来たりしていますし、僕が買った10th CoreのMacBook Airは1.1GHzで周波数大幅に下がったりしています。数年前に知人が「なんか最近のパソコンはコア数は増えたりするけどあんまり変わり映えしないよね」とか言ってる人もいました。でも、そうじゃないんです。

自分で使ってみた(会社支給も含めて)のパソコンのCPUと、だいたいのシングルコアの性能をリストアップしたのが以下のものです。基本ノートばっかりで、途中で低消費電力モデルとかに変わったりしていますが、ガンガン伸びているのがわかります。なお、これはシングルコア性能なので、コア数が増えまくっている現在、マルチコア性能はさらに大きな差になっています。

CPUモデル 周波数 Geekbench Single Coreスコア
2010 Core 2 Duo L9600 2GHz 300
2011 Core i7-2600QM 2GHz-3GHz 600
2013 Core i7-4500U 1.8GHz-3GHz 700
2017 Core i5-8250U 1.6GHz-3GHz 800
2019 Core i5-1030NG7 1.1GHz 1000
2020 Core i7-1185G7 1.2GHz-3GHz 1500
2020 Apple M1 3.2GHz 1700
2022 Apple M2 3.4GHz 1900

まあ後半のインテルのモデルになると同じCPUでも熱設計で性能が大きく変わったり、ブースト時の性能だったり、いろいろあるのであくまでも数字は目安ですが、無視できないほど大きくなっているのがわかります。特に、Ryzenが元気なここ5-6年の競争による進化がすごいです。

なぜ5-6倍も性能が上がったのか、というのをすぐに言葉できちんと説明できる人はあまりいないと思います。最近、更新がなくなってしまい、Facebook(なぜか友達にしていただいた)上でも活動がみられなくて、悲しいのですが、後藤弘茂のWeekly海外ニュースの連載をずっと読んでいた人であれば、「命令デコーダーが増えたのね」とかなんとなく強くなった部分のイメージがつくとは思いますが、そのなぜ、というのに、実験付きで数値の根拠も含めてわかりやすく説明してくれているのが本書です。

CPU実験がおもしろい

本書は、豊富な図で(LambdaNoteのページでサンプル見れます)、CPUが行っている数々の仕事が説明されています。最初はスーパースカラなどの高速化技法だったりしますが、中盤からは、OSが要求する複雑な機構(仮想メモリとかシステムコールとか)などを、CPUがどう扱っているのかを説明してくれます。後半になると、キャッシュの整合性(コヒーレンス)、メモリモデル、マルチコアなどの説明になっていきます。

高速化の機構の効果と、それが失敗したときにどれぐらいペナルティがあるのかをアセンブラのプログラムで見せてくれます。本当に、ちょっとした違いで性能が数倍も変わるような、鮮やかな実験結果が見せてくれているのはありがたいな、と思いました。

同じジャンルの類書としてはWEB+DB PRESS plusシリーズのプロセッサを支える技術もあり、これも良い本なのですが、プログラムを高速に書きたい人向けという視点で書かれており、この実験があるのが大きな違いだな、と思いました。あとは、ARMやRISC-Vについても解説してくれています。アセンブラにもちょっと親しみを持てる本です。

個人的に面白かった章

言葉としては知っているが、どういう実装になっていたのかがいまいちわからなかった4章の予測分岐と、5章のキャッシュですね。内部の仕組みまで解説されていますし、性能アップに効くL1キャッシュがなぜこれ以上大きく増やせないのか、といったことがわかる章になっていました。

僕がちょっと深く知りたいな、と思っていて、まさにストレートに知りたい情報があったのが11章のメモリの順序付け、いわゆるメモリモデルの話です。Go 1.19ではメモリモデルが更新されたよ、という更新があり、がんばって英語のドキュメントを何本も読んで解説を書いたりしたのですが、どのような不整合がありえるのか、というのが豊富な絵と事例で紹介されていてよくわかりました。

あとは、Netflixの64バイトのキャッシュを意識した改善で性能3.5倍という話が、いまいち理解できなかったのですが、この本をみながらだと「わかる!わかるぞ!」と読めます。関係ないですが、NetflixのWednesdayを最近みているのですが、面白いです。4話まで見ました。

もう少し知りたかったこと

本書は、コンパクトにまとまっているし、CPUが自分で実装できるほどの情報はなく、その上で動くソフトウェア開発者が道具として使うのに便利な情報に割り切って書かれている気がするので、今後改訂がされてもあまり増えることはないかもしれませんが、マイクロコードの違いみたいなのをもっと知りたいな、と思いました。

書籍でもIntelとかのサイトへのリンクは貼られているのですが、同じARMでも吊るしのARM製の実装と、Appleの実装、そしてSparcを作ってきた富士通のA64FX。それぞれだいぶ性能差もあるし、命令セットは同じだとしても内部は全然違いますし。RISC-Vも命令セットはオープンだけど、実装によってだいぶ変わりそうだし、今まで以上にマイクロコードの違いを意識する時代になっていきそうだなーとなんとなく思っています。

あとは、M1/M2が、Intelのエミュレーション向けにメモリモデルを変えているとかなんとかという話を見かけた気がするのでそのあたりもちょっと知りたかったな、と。まあどちらも知りたい人は読者の1/100ぐらいかもしれませんが。

あとは、最近モバイルCPUによく詰まれ始めたNPU。どんなもので、どういう気持ちで動いているのかがわからないので、別の本でもいいので書いて欲しい!と思っています。本書の内容からは大きくはずれちゃいますが。

ぜひGoならわかるシステムプログラミングの読者も

僕は実は、Goならわかるシステムプログラミングという本を書いていたりするのですが、この本は、自分の本とセットでぜひ読んでもらいたいな、と思う内容も多かったです。実は2版の3刷の増刷で、参考文献に足させてもらったりしました。CPUの核の高速化の部分は僕の本当はあまりオーバーラップはしないのですが、第6章の仮想記憶、第7章のI/O、第8章のシステムコール、例外、割り込み、第12章の不可分操作あたりは、この本を一緒に読んでもらうと、理解が一層進みそうな気がします。よりCPUの気持ちがわかると思います。

不可分操作は、ミューテックスやロックがないので、ソースコード上は「ロックフリーじゃん」と思って、結構良いものでは、と思ったのですが、実はこんなにペナルティがあるよ、というのは新鮮でした。 Go上でもきちんと測定しないといかんですね。

まとめ

これを読んだら誰もがスーパーエンジニアになれるわけではないのですが、スーパーエンジニアなら理解した方が良いだろうことが書かれている本です。というよりも、今まではごく一部のすごい人が知っている知識であったものが、この本が出版されてしまったことで、スーパーなエンジニアなら当然知っているよね?という水準がぐっと上がったように思います。僕もさらなるスキルアップのために、枕元に置いて生活しようと思います。

また、前に触れた後藤さんの連載を追いかけてこなかった人も、この本を読むと、最近のCPUの工夫の一旦の知識レベルが一定水準までぐっと底上げされると思います。他の書評にあったように、省電力周りとかはなかったりもしますが、この辺りの知識があると、日々のニュースの中でCPUネタとか半導体ネタに対する情報感度や解像度があがって、楽しくなると思うのですよね。ぜひ、おすすめです。

次は棚井さんのスッキリわかるJava 実践編 第3版です。