みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

プログラマーのためのCPU入門 を読了した

CPUは高速に処理するためにどのようなしくみで動作しているのか? いまいちよく分からなかったので,本で勉強することにしました.専門的なCPUの本はおそらく理解できないだろうと思ったので,読みやすそうな本を探したところ,以下の本を見つけました.

現代のCPUの性能は、「メモリとやり取りしながら命令を実行していく」というCPUの原理的な仕組みを知るだけでは説明できません。ソフトウェアを高速に実行するためにCPUシステムが備えているパイプライン化やスーパースカラ化の挙動をはじめ、アウトオブオーダー実行、分岐予測、キャッシュ、TLBといった高速化のためのハードウェア機構、さらにはI/Oやシステムコールなどの例外・割り込み系がCPUの動作に及ぼす影響について、幅広く知る必要があります。
さらに、現在では広く利用されているマルチプロセッサのCPUシステムにおいては、複数のキャッシュの一貫性を制御するための仕組みがソフトウェアの実行性能に与える影響や、複数のCPUからのメモリアクセス順序を強制したり不可分操作を実現したりする仕組みをソフトウェアで明示的に利用することによる影響を考慮しなければならない場合もあります。
本書では、豊富な図説と簡潔なコードを交えながら、CPUが備える高速化のためのさまざまな仕組みとその動作を阻む要因、さらにはソフトウェアで可能な対策について、ハードウェア技術に馴染みがないプログラマーでも十分な直感を得られるように解説していきます。*1

要約します.

CPUはパイプライン化,スーパースカラ化,スーパーパイプライン化,マルチプロセッサにより処理量を増やしながら,キャッシュメモリやなどの技術で効率を上げる工夫をしています.しかし,真のデータ依存関係,分岐命令の予測ミス,キャッシュミス,仮想記憶へのTLBミス,I/Oアクセス,システムコール,例外,割り込み,コヒーレンスミス,メモリ順序付け,不可分操作などの要因によりその効率が下がってしまうので,これらを避けなければなりません.C言語やRustなどのプログラミング言語ならば工夫が可能ですが,PythonやJavaScriptなどではできることは少ないです.ソフトウェアの目的を達成するためにはCPUの効率が低下する処理が存在することはある程度避けられません.したがって,マルチプロセッサ対応にしてソフトウェアを分割設計したり,データのメモリアクセスを改善するようなデータ構造を設計することが最も重要です.また,処理負荷が集中している部分に絞って改善するのが効率的です.予想しない性能劣化は起こりうるので,実装後に測定して確認するのが重要です.I/Oアクセスは遅いので非同期処理を利用すると効率が上がる場合があります.

著者の主張したいことが分かりやすく記載されていた本だったので,簡単に要約できました.

現在手に入るパソコンのスペックならば,ほとんどの処理はCPUの処理能力を気にしなくても一瞬で完了します.しかし,みーのプロジェクトの中に,気軽にプログラミングしたら処理に時間がかかりすぎるものがあって困っていたので,この本で学んだことを活かして効率的な実装に直そうと思いました.

CPUの専門的な内容を平易に説明している良書でした.