計算機アーキテクチャの可視化
計算機は固定幅のビットと解釈規則で数を表します。八ビット符号なしの 255 + 1 が 0 に戻ること、二の補数の最上位が負の重みを持つこと、減算を加算で実行できることは、規則と有限の幅から生じます。
画面はビットをラベル付きの固定位置へ置き、語の境界と、外へ出る桁上がりを表示します。
レッスンの比較
| レッスン | 問い | 変化 | 失敗境界 |
|---|---|---|---|
| 二進数 | ビット列の意味 | 位置 k の重みは 2^k | 八ビットの 255 + 1 は 0 |
| 二の補数 | 負数の表現 | 最上位を +2⁷ から −2⁷ にする | 127 + 1 は −128 |
| IEEE 754 浮動小数点 | 小数の表現 | 三フィールドに分け、指数で小数点を動かす | 0.1 + 0.2 は 0.3 と等しくない場合がある |
| ブール論理とゲート | 加算の実体 | 真理値表を配線で組み合わせる | 一ゲートを誤っても四行中三行は正しい |
| 命令実行 | 語が命令になる理由 | PC の指定語を fetch して解釈する | 保存した数も命令として実行され得る |
| CPU パイプライン | 五段の重なりは各命令を五倍安くするか | 五段を同時に動かし、一周期一命令を発行 | 直後の命令が lw の値を使うと待機が残る |
| キャッシュ階層 | 十二ロードが 804 または 3072 周期になる理由 | アドレスが広がるライン数 | stride 4 は 3072、stride 1 は 804 |
| 分岐予測 | 未解決の if の先へどう進むか | 推測して進み、誤りなら投機作業を捨てる | 予測困難な分岐が仕事を無駄にする |
最初の二課は、1 の位置の重みを足します。二の補数は最上位だけを変えるので、同じ加算回路で符号を調べず固定幅の結果を作れます。
浮動小数点は符号、指数、仮数部へ分けます。短い語で広い範囲を得る代わりに、表せる値は等間隔でなく、多くの十進小数を丸めます。論理ゲートの課では加算器を開き、抽象的な桁上がりが配線で生じる様子を見ます。
推奨する学習順序
二進数は 2 で割って低位を取り出し、置かれた位の重みを足して戻します。計数モードは連続した 1 を桁上がりが伝わる様子を示します。255 + 1 では八位置がゼロになり、桁上がりを置く九番目がありません。
二の補数は最上位の重みだけを変えます。負号を反転し、負数と正数を足して、加算器が符号を調べないことを確認します。符号付きのオーバーフローと最上位キャリーの破棄は別の判定です。
IEEE 754では 0.1 の終わらない二進展開と、保存された値を読みます。0.1 + 0.2 の後に binary32 へ切り替えると、フィールド幅と丸めの違いで、本例の 0.3 との等値判定が偽から真になります。十分の一に固有の規則ではなく、各段階の丸め位置が決めます。
ブール論理とゲートは真理値表から加算を組みます。二入力の四通りが、配線によって新しい表になります。誤った加算器では一ゲートを変えても四行中三行が正しく、少数の成功例だけでは足りません。
命令実行は固定幅の語を opcode と三フィールドに分けます。PC の語を取得し、PC を進め、解読し、命令を実行します。同じジャンプ語を取る場合と取らない場合で比べ、自己変更の例では HALT の位置へデータを書いてから実行します。この教材機械には別のコード型印がなく、PC が到達した語を命令として扱います。
CPU パイプラインは五命令を各段に重ねます。既定の五周期目は WB MEM EX ID IF です。その後、第四命令が第三命令の未書き戻しレジスターを必要とし、二周期待って実行段に穴ができます。転送を有効にすると、同じ五命令が 13 周期から 10 周期になります。パイプラインレジスターから値を取れるためです。ただしロード値はメモリー段の後まで存在せず、一回の待機が残ります。
分岐予測は条件確定前に推測して取指し、誤りなら誤経路の仕事を捨てます。既定ループの二ビットカウンターは序盤で二回費用を払い、後の再突入で傾向を保つ利点を得ます。同じ値とコードの整列・シャッフル例は 52 と 62 周期で、配置が分岐挙動を変えます。
最後はキャッシュ階層です。コードは同じ load() で、アドレスだけを変えます。最初のミスは四語を一度に戻します。十二ロードでも stride 1 は三ラインで 804 周期、stride 4 は十二ラインで 3072 周期、ほぼ四倍です。競合例は四行中三行が空でも入れ替え続けますが、二ウェイへの変更で解消します。
注目する点
- ビット 3 は位置、8 は重みです。左端はビット 7 で、重みを逆に読みません。
- 固定幅の加算は外のキャリーを捨てます。符号なしの回り込みと符号付きのオーバーフローを分けます。
- 二の補数は大部分の二進演算を保ち、解釈を変えます。
- 整数は等間隔ですが、浮動小数点の間隔は指数領域とともに広がります。丸め、吸収、計算値の
==への注意につながります。 - 桁上がりは規則としても、その下のゲート配線としても追えます。
- PC をどの命令が更新するかを見ます。実行位置の変更が制御フローを作ります。
- ストールは一段がその周期に有効な仕事をしないことで、空の部分が後段へ動きます。
- 予測ミスは正しい結果を保っても再実行費用を増やし、通常はソース上の例外として現れません。
- キャッシュは要求語を含むライン全体を運びます。後の同ラインの利用は下層からの再取得を省きますが、ヒットも無時間ではありません。
アーキテクチャの可視化一覧
値や場面を変え、Python のコードとトレースを一段階ずつ確認してください。