CPUの仕組み|Week 6

CPUの基本動作

命令を読む、解読する、計算する、必要ならメモリへ行く、結果を戻す流れを追います。

命令を一段ずつ追うと、CPUの中で何が変わったかが見えてくるよ。
回路図タブレットを持ち、学習者を案内する半導体設計者の先生

この週でできるようになること

  • ISAとマイクロアーキテクチャを区別できる。
  • 命令の取得から書き戻しまでを追跡できる。
  • 機械語、アセンブリ、高級言語の関係を説明できる。
  • load/storeと算術命令でデータ経路が違うことを説明できる。

まず、具体的な場面から

LOAD

メモリの値をレジスタへ読む。

ADD

レジスタの値を足し、結果を戻す。

分岐

条件に応じて次に読む命令の場所を変える。

見えてくること:命令の種類で使う部品は違いますが、『取得→解読→実行→必要ならメモリ→書き戻し』で整理できます。

CPU命令の基本5段階IF取得、ID解読、EX演算、MEM記憶、WB書き戻しの順に進む。IF取得→ID解読→EX演算→MEM記憶→WB書戻
命令によって、MEMやWBで実際に行う仕事は異なります。

ここで初めて、見えてきた関係を言葉や記号でまとめます。

IF → ID → EX → MEM → WB

IFは取得、IDは解読とレジスタ読出し、EXは演算、MEMはメモリアクセス、WBはレジスタへの書き戻しです。

なぜそうなる?

PCが次命令の位置を覚え、制御回路が命令を解読してデータ経路を選びます。すべての命令が5段すべてで同じ仕事をするわけではありません。

講義ノートで詳しく読む

元のMarkdownにある仕組み・図・用語を、順番に確認します。

1. ISAとは

ISA(Instruction Set Architecture)はソフトウェアから見えるCPUの契約です。

  • 使用できる命令
  • レジスタの種類と数
  • データ型とビット幅
  • メモリアドレスの扱い
  • 例外・割り込みの基本動作

x86、Arm、RISC-VはISAまたはISAファミリーです。同じISAを実行するCPUでも、パイプライン段数、キャッシュ、実行ユニット数などの内部実装は異なります。この内部実装をマイクロアーキテクチャと呼びます。

2. プログラムが命令になるまで

C/Pythonなどのソース
  ↓ コンパイラ・処理系
アセンブリ
  ↓ アセンブラ
機械語(ビット列)
  ↓
CPUが命令として解釈

Pythonなどでは仮想機械やインタープリター、JITなどが間に入ることがあります。ここでは、最終的にCPUがそのISAの機械語を実行する点を押さえます。

3. 命令の基本構造

概念的な命令は、操作を示すopcodeと、対象を示すoperandからなります。

ADD R1, R2, R3   ; R1 ← R2 + R3
LOAD R1, [R2]    ; R2が示すメモリからR1へ読む
STORE R1, [R2]   ; R1をR2が示すメモリへ書く
BEQ R1, R2, L    ; 等しければLへ分岐

実際の表記と動作はISAにより異なります。

4. 5段階の命令実行

基本モデルとして次を使います。

  1. IF(Instruction Fetch):PCが示すアドレスから命令を読む。
  2. ID(Instruction Decode / Register Fetch):命令を解読し、必要なレジスタを読む。
  3. EX(Execute):ALUで計算する。load/storeではアドレスを計算する。
  4. MEM(Memory Access):必要ならデータメモリを読む/書く。
  5. WB(Write Back):結果を宛先レジスタへ書く。

すべての命令が全段階で同じ仕事をするわけではありません。加算命令はMEMで何もしない場合があり、store命令には通常レジスタへのWBがありません。

5. 命令を追跡する

初期状態を次とします。

R1 = 100
Memory[100] = 7
R2 = 5

命令:LOAD R3, [R1]

IF  : 命令を取得
ID  : R1=100を読み出す
EX  : 実効アドレス100を計算
MEM : Memory[100]から7を読む
WB  : R3へ7を書く

次の命令:ADD R4, R3, R2

IF  : 命令を取得
ID  : R3=7、R2=5を読む
EX  : 7+5=12
MEM : 使用しない
WB  : R4へ12を書く

6. 分岐

条件分岐では比較結果に応じてPCを変更します。次に読む命令が確定するまで待つとパイプラインが止まるため、現代CPUでは分岐予測が重要になります。

ループ、if文、関数呼び出しは制御の流れを変えます。CPUはこの複雑な流れを高速に扱うよう設計されています。

7. CPUとOS

CPUは単独でアプリを管理するわけではありません。OSがプロセス、仮想メモリ、入出力、割り込みなどを管理し、CPUの特権機構を利用します。同じコアで複数プログラムが動いて見えるのは、OSが実行時間を切り替える効果も含みます。

例題で確かめる

例題

R1=100、Memory[100]=7、R2=5。LOAD R3,[R1] のあと ADD R4,R3,R2 を実行すると?

  1. LOADのEXでアドレス100を得て、MEMで7を読み、WBでR3=7。
  2. ADDのIDでR3=7とR2=5を読み、EXで7+5=12。
  3. ADDのWBでR4へ12を書く。

答え:R3=7、R4=12。ADDではデータメモリへのアクセスを使いません。

実習

Nand2Tetris CPU Emulatorを開きます。

  1. @value、D=A、M=Dなど簡単なHack命令を一命令ずつ進める。
  2. Aレジスタ、Dレジスタ、PC、RAMの変化を表へ記録する。
  3. ジャンプ命令でPCが連続増加しない場合を確認する。
  4. 同じプログラムを連続実行し、単ステップ観察との違いを記録する。

記録表:

step PC instruction A D changed memory
0

説明課題

LOADとADDを、IF・ID・EX・MEM・WBの各段階で比較してください。

練習問題

元ノートの小テストです。まず自分で答えを考え、必要なら下の答えを開いてください。

  1. ISAはソフトウェアから見える仕様か、物理的な配線図か。

    答えと考え方を見る

    ソフトウェアから見える仕様。

  2. 命令を解読しレジスタを読む段階は何か。

    答えと考え方を見る

    ID。

  3. load命令でメモリアドレスを計算する段階は何か。

    答えと考え方を見る

    EX。

  4. PCの値を変更する代表的な命令を一つ答えよ。

    答えと考え方を見る

    条件分岐、無条件ジャンプ、関数呼び出しなど。

  5. 同じISAのCPUで性能が異なり得る理由を答えよ。

    答えと考え方を見る

    同じISAでもパイプライン、実行幅、キャッシュ、分岐予測、周波数などのマイクロアーキテクチャが異なるため。