計算機アーキテクチャの可視化

計算機は固定幅のビットと解釈規則で数を表します。八ビット符号なしの 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 のコードとトレースを一段階ずつ確認してください。