歌いだし
いい本だいい本だと言われるのをTLで見て本棚に積んでいた『プログラマーのためのCPU入門』をやっと読んで、想像してたよりもずっと自分に刺さる本だったの感想をまとめる。
プログラマーのためのCPU入門 ― CPUは如何にしてソフトウェアを高速に実行するかwww.lambdanote.com
経緯
去年の終わりごろから『並行プログラミング』入門を読んでたんだけど、主にメモリオーダーのところがあんまり腑に落ちなかった。具体的には、サンプルプログラムからメモリオーダーに関する命令が全部消されて、「このプログラムが正しく動くために、適切な位置に、適切な強さのメモリオーダーを指定せよ」と言われると全然わからないんだろうなという感じ。あとはグリーンスレッドの例でコアロジックがアセンブリで書かれてたんだけど、操作的意味がおそらく高レベルの言語とは全然違い、暗黙の前提がわからず理解が著しく難しいという問題にも直面した。この時にもう少しレイヤーの低い技術に対する知識が欲しいという気持ちになってたまたま調べたメモリモデルに関する技術記事に今回の本が参考文献として挙げられていて、そういえば本棚にあったなと気づいて読み始めた。
あと自分はミーハーなので、いつも参考にしている人がおすすめしていると自分も真似したくなり、この記事でも言及されていたことでモチベがあがった。
本の構成
この本の構成は、まず最初にCPUが高速化を図るためにどのようなことをしているかを説明する。CPUは命令を滞りなく高密度で流すことを至上課題として持っていること。それを実現するためのパイプライン化とスーパースカラ化という標語がよく印象に残っている。
その後はずっと、このCPUが命令を滞りなく流れるのを阻害する要因を章ごとにわけて解説していくスタイルになっている。この構成がかなりきれいな構造をもっていて理解がしやすく、そのため読書メモも取りやすかった。各章では高速化を阻害する要因の説明、それがなぜCPUを遅くするのかの原理の説明、これを抑制するためにソフトウェア側でできることの紹介、最後にアセンブリプログラムを使った簡単な実験が展開する。この実験がよくて、直観を掴んだり、直前に説明されたことが手元のPCで検証される興奮を味わうことができた。
CPUがどの要素によってなぜ遅くなるのかという切り口で展開されるので、高速化を求める人のための本だと思うかもしれないが、自分はそうではないと思った。素人なので適当なことを言うが、多分CPUにとっては高速化は存在意義といっていいほど根幹にかかわるモチベーションで、高速化のための工夫の結晶が現代のCPUなんだと思う。したがって、CPUを高速化するための仕組みとそれを妨げる要因を知ることは、CPU自体について本質的な理解につながるのだと思う。
特に自分に刺さったところ
メモリ順序付けに対する理解が深まり、副次的に並行プログラミングに対する理解が深まった
これがめちゃくちゃデカかった。冒頭でも述べたけど直前に読んでた『並行プログラミング入門』のメモリ順序付けに関するところが突出して理解があいまいだったけど、この本のマルチプロセッサに関わる章(9~12章)を読んでかなり理解が進んだ。
たとえば『並行プログラミング』入門のサンプルプログラムを読んでも、メモリ順序付け命令と、アトミック操作の命令と、ミューテックスやSTMなどのソフトウェアとして並行プログラミングの安全性を担保する仕組みが全部ごっちゃになっていて、それぞれの責任範囲や動機や意義がわからなかったが、この本は解決したい小さな例と一緒に説明されるのでかなりクリアになった。具体的なイメージとしては、並行プログラムを見たときに、頭の中でそれを実行する複数のCPUと、その中の1つ1つのCPUがそれぞれの命令流を高速化のために適宜順番を入れ替えながら処理していくさまが想起されて、その中でプログラマがメモリフェンスやアトミック命令などをいれないと破綻する箇所がなんとなくわかるようになった。今までマルチプロセッサでのプログラム実行に対するメンタルモデルがほぼないに等しかったので、読んでいくうちに頭の中にモデルが構築されていく感覚が本当に気持ちよかった。
余談だけど、この部分はこの本を読む前にChatGPT(o1)に何回か解説してもらったけど全く腑に落ちなかった。少なくとも自分にとっての理解は対象に関連する事象を論理的な構造として組み上げることだけど、今のChatGPTには多分それはできない。対象に関連しそうなことをみだれうちして、それを適切に組み上げられるだけの予備知識を持った人だけがそれらを組み上げて理解の形をつくることができる。その予備知識がない人はこういう、体系的に書かれたいい本を読んだ方が早い。というか、予備知識がある人もこういう本を読んだ方がいい(いつもそういう本があるとは限らないからChatGPTはえらい)。
アセンブリに対する抵抗が減った
思わぬ副産物だった。実験プログラムはもちろん、簡単なCPUの動作例の時に使われるのも数行のアセンブリなので慣れちゃった。タスクに対する人間のパフォーマンスは、そのタスクを自分は得意なのかどうかという自己認識にすごく依存するような気がしているので、アセンブリに対する恐怖や警戒が解かれたのはめちゃくちゃありがたいこと。3,4年前に勢いで買って中身を見て絶望した『低レベルプログラミング』、今は怖くないかも。
おすすめしたい人
低レイヤー(曖昧)に興味があるけどまだよくわからない人には入門としてとてもいい気がします。これは自分がそうだったから。あとは『並行プログラミング』を読もうとしている人。マルチプロセッサの部分だけ最初に読む、あるいは必要な時にここにジャンプして読むとかでもいいと思います。もっと一般的に、並行プログラミングについて丁寧に理解したい人にもおすすめです。当たり前だけどCPUの技術全般に興味がある人にもいい。読書案内もかなり豊富でまさに最初の一冊にうってつけっぽい感じです。
最後にひとこと
めっちゃいい本読んだ~~~~!!著者の方、そしてラムダノートさん、ありがとう......。