コンピューターの構成と設計 上(パタヘネ)を読んだ

コンピュータの構成と設計 第5版 上を読んだ。

先日のMeltdownとSpectre問題とかの関連でCPUについてもう少し深く知りたいな〜という気持ちがあったのとちょうど正月にCS基礎教養をまとめてて読もうと思ってたところだったのでちょうどよかった。

パタヘネ本は結構内容が濃いと聞いていたので隅から隅まで本気で読むと絶対続かないな〜と思ってたから、今回はCPUの全体的なアーキテクチャの話とかCとかの普段使う言語がプロセッサでどう実行されるのかとかその辺の基礎的な部分の理解にしぼってさくさく読んでみた。

一通り読んでみて、入門レベルの書籍だとプログラムが実行されるにはメモリにロードされてプロセッサで実行されますくらいにしか説明されないが、パタヘネでは具体的にどのようにCPUで実行されるのかみたいな話をソフトウェアレベルからハードウェアのレベルにまだへりくだって解説してくれるのが良いなと思った。

高水準言語>コンパイル>アセンブリ言語>アセンブラ>機械語の流れから、メモリにストアされた機械語の命令がレジスタにロードされてフィールドの値からどの命令なのか解釈されALUで処理してうんぬんみたいな話とかこういうの大学でやっておくべきだよなーとかとか思ったりした。

アセンブリ言語も今回初めて学んだけど、(MIPSだからなのかもしれんが)割と理解しやすくてこんなもんなのかーと拍子抜けした。

たしかに32ビットに命令が収まらない場合とか浮動小数点の計算とかでルーチン実行でスタック積んだりとか難所はある気はしたけど。

この本ではアセンブリを「人間の読める言語」と呼んでいたのだけど、"人間が読める"ってなんだろうみたいなことを考えたりした。

機械語読めなくてアセンブリ読めるの違いはどこにあるのだろうか。

たしかにアセンブリ機械語に比べたら自然言語に近いけど。

無味乾燥な0と1の組み合わせの機械語でもフィールドごとに意味があって、どのフィールドがこの値ならadd命令であるとかわかるのなら機械語も"読める"言語なのでは?みたいな、よくわからん哲学に突入してしまい疲れた。

パイプライン処理の章では話題の投機実行についての話にも触れてたけどOOハザートのあたりとか詳細はよくわからんかった。実際にCPUの設計をして実装をする人とかはちゃんと理解しないとだめそうだけど。

なんか素人考えだとコンパイラである程度変数同士の依存関係とかわかるからそこで最適化したらプロセッサがその辺の予測処理しなくてもいいんじゃねとか思ったりもしたのだがそういうもんではないっぽい。命令の並列処理とか分岐予測とかプロセッサの最適化は複雑で奥深ぇな〜みたいな雑な感想。

東大の計算機システムの授業だとこの辺のCPUに関する話に加えてプロセス・ファイル・ネットワーク系のOSの話も対象になってるらしい。なのでパタヘネとふつうのLinuxプログラミングを読めばだいたいカバーできるのかなという感じ。

これは2年生のカリキュラムということなので彼らは20歳とかそこらでこの辺のコンピュータの基礎的な話題を身につけていくのか、たまらんな...。

今回は上巻のみ読んだけど、結構後半飽きてきたりしたので下巻は読まない気がする。欲しかった情報とか読みたいトピックは一応手に入ったと思うし。

最後に、株式会社GIFMAGAZINEではパタヘネ本くらい余裕で読んでるぜというエンジニアも募集しています。

あとはいつもの雑なScrapboxの読書メモです。


本書目的
  • ソフトウェア・ハードウェアの両面からそのインターフェースを含めコンピューターの内部構成を知ることでプログラムの性能を最大限に引き上げる方法を学ぶ
対象コンポーネント

コンピュータの抽象化とテクノロ

プログラムの裏側
コンピューターの内部
  • 入力・出力・記憶・プロセッサ(データパス + 制御)
    • 今回は特にプロセッサの部分をメインで読んでく
  • タッチスクリーンの仕組み
    • 静電容量方式。静電界(絶縁体のスクリーン)に電気的な導体(人の指)が触れることで界に歪みが生じタッチを検知させる。
  • (速さ) DRAM/SRAM(揮発性) >> フラッシュメモリ(不揮発性) >>>>>> HDD(不揮発性)
プロセッサ及びメモリを製造するための技術
  • 集積回路
  • 集積回路の作り方: シリコン結晶インゴット(ソーセージみたいな棒) > 薄く切る > ウエーハ > パターンを焼き付け > 切り出す > ダイ(チップ)
  • ダイを小さくすればウエーハからきりだせる数が増えるのでコストを下げられる
  • ダイが大きいとウエーハからきりだせる数が減るので全体における欠陥率が上がる。よって歩止まり(良品率)が下がりコストが上がる。
性能
  • 性能を計測するときの目安の話
  • ネットワークとかIOの性能
  • CPUの性能
    • CPU実行時間
      • ユーザーCPU実行時間
      • システムCPU実行時間
    • クロック・サイクル数
    • クロック・サイクル時間
    • 命令あたりのクロックサイクル数(CPI)
    • CPU実行時間 = クロック・サイクル数 x CPI x 実行命令数
    • CPU実行時間 = 実行命令数 x CPI / クロック周波数
  • 基本情報の試験思い出す
電力の壁
  • 消費電力による熱が問題になってきた
  • ワットを下げれば熱は抑えられるがそれももう限界
  • 新たな冷却方法が求められる
方向転換 単体プロセッサマルチプロセッサ
終わりに
  • 実行時間 is All。性能比較はプログラムの実行時間がすべて。

命令:コンピュータの言葉

内容
前提知識
  • コンピュータのアーキテクチャ
    • ハードウェアに対するプログラムやOSからのソフトウェアインターフェースの定義
  • 命令セットアーキテクチャ
  • 命令セット
    • コンピュータのハードウェアに対して命令を伝えるための言葉の語彙
      • CPUが理解できる命令の集合 : 引用
  • MIPSアーキテクチャ
  • レジスタ
    • CPUの演算結果やメモリからロードした語を格納しておく一時記憶装置。MIPSアーキテクチャでは32ビット。
  • MIPSではアドレスが4の倍数(整列化制約)
  • 符号つきとか符号無しビットの話、基本情報思い出す。最上位ビットが0で正、1で負になる。2の補数のやつ。
コンピューター内での命令表現
  • 32bitのMIPSアセンブリ機械語に変換する
    • 8~15を$t0~$t7, 16~23を$t0~$t7のレジスタ番号に割り当てるとすると
    • add $t0, $s0, $s1のアセンブリ言語での演算表現は下記のようになる
      • 0 17 18 8 0 32(10進数表現)
      • 000000 10001 10010 01000 00000 10000(2進数表現)
      • 6bit 5bit 5bit 5bit 5bit 6bit (計32bit)
      • op rs rt rd shamt funct (MIPSの命令フィールド)
    • メモリからレジスタへのデータ読み/書きは後半16bitをアドレス表現用に利用してる。add/subと同じフィールドの利用法ではない。
論理演算
  • Xをiビットシフトすると2**i x Xしたのと同じ意味になる
    • 例) 0000 0000 0000 0000 1001(= 9) => 4ビット左シフト => 0000 0000 0000 1001 0000(= 144)
      • i = 4, 2**4 = 16, 16 x 9 = 144
制御構文
  • if, while,caseにあたる宣言のみある
    • beq, bneとか
手続き呼び出し
  • 引数4つ以上or戻り値が2つ以上のときはレジスタをスタックでメモリにスピルアウトする必要あるらしい
  • MIPSレジスタ規約に0~31番の各レジスタの役割が書いてるので便利
アドレッシング方式
マシン語の復元
  • 2.2.10に16進数表記のマシン語アセンブリに復元する例が書いてある。楽しい感じになってきた。命令の各フィールドの意味とか対応するレジスタの値とかがわかると意外と理解できる気がする。

コンピューターにおける算術演算

内容
  • 算術演算どうやってるか
  • 数値のオーバーフローとかの扱い
  • 浮動小数点の変換
    • 10進数から2進数表現に変換するやつ
  • 浮動小数点の表現法
  • 浮動小数点の算術演算
  • プロセッサにとって加算と減算は比較的楽だけど乗算と除算は計算複雑なことがわかる
    • 前者はオーバーフローとか気にしなければ単純なビットシフトで求められるけど後者はそうではない
  • アルゴリズムの宝箱とかueyamaruiさんのnoteでも読んだ内容だったから全体的に飛ばし目に読んだ
  • プログラム内蔵方式のプロセッサでは数値も命令もアドレスもすべて32ビットの数。同じ32ビット表現でいろんな意味を表現する。

プロセッサ

内容
  • (比較的単純な)MIPSっぽいプロセッサの構築法
  • パイプラインの話
命令実行の流れ
  • プログラムカウンタ(PC)#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF) > 命令メモリ > レジスタ > 算術論理演算装置(ALU) > データメモリ
    • PCのアドレスを使って命令メモリから次の命令をレジスタにロード
    • 読み込んだ命令からオペランドとかが指定される
    • ロード・ストア命令ならALUでメモリのアドレス計算 > 結果をレジスタに書き込む
    • 算術演算命令ならALUで計算 > 結果をレジスタに書き込む
  • マルチプレクサ(MUX)
    • いくつかの入力から一つに絞って制御する。ALU or データメモリからレジスタへの入力とかをどちらかに絞る
  • 制御ユニット
    • 命令タイプごとにどの作業をするか制御する
データパス構築
  • データパス
    • 各ユニットをつなぐデータの経路
  • 単一サイクル方式
    • 1 クロック・サイクルにつき 1 命令を実行するような方式
      パイプライン処理
  • 複数ある命令において1サイクル1命令で処理するのではなく、各命令をステージごとに並行に実行させることで命令全体のスループットをあげる処理方法。個々の命令自体の処理は別に速くなるわけではない。
投機実行
  • 今話題のやつ
  • 投機 実行( speculation) とは, 主要 な アイデア の「 予測」 に 基づい て, コンパイラ または プロセッサ が, 命令 の これから 先 の 挙動 を「 見込ん で」, 対象 に なっ て いる 命令 の 完了 を 待つ 必要 が ある 他 の 命令 の 実行 を いち早く 開始 可能 に する 技法 で ある. たとえば, 分岐 の 結果 を どちら かに 見込め ば, 分岐 の 後 の 命令 の 実行 を いち早く 開始 できる. あるいは, ストア 命令 に 続く ロード 命令 が ストア の 結果 を 使用 し ない だろ う と 見込め ば, ストア 命令 よりも 先 に ロード 命令 を 実行 できる. 投機 実行 には, 見込み が 外れ た 場合 は どう する か という 課題 が ある. この ため 投機 実行 の 機構 には, 見込み が 正しかっ た か 否 かを チェック する 機能 と, 見込み に従って いち早く 実行 し た 命令 の 効果 を 元 に 戻す 機能 の, 両方 を 備える 必要 が ある. こうした 復元 機能 が 必要 な ため, 投機 実行 を サポート する プロセッサ は どうしても 複雑 性 が 高まる.   投機 実行 は コンパイラ に 担当 さ せ ても よい し,(4.10 命令を通じた並列処理)