高速なCPU
パイプラインで仕事を重ね、待ち時間や分岐の影響を減らす考え方を学びます。

この週でできるようになること
- レイテンシーとスループットを区別できる。
- パイプラインの利点とハザードを説明できる。
- 分岐予測、投機実行、アウト・オブ・オーダー実行の目的を説明できる。
- クロック、IPC、コア数の一つだけでは性能を決められないと理解する。
まず、具体的な場面から
5段なら完了まで少なくとも5段を通る。
前の命令が次段へ進んだら、次の命令を入れられる。
前の結果がまだないと待つ必要がある。
見えてくること:パイプラインは一命令の仕事を消すのでなく、命令同士を重ねて全体の処理量を増やします。
ここで初めて、見えてきた関係を言葉や記号でまとめます。
CPIは1命令あたりの平均サイクル数、クロック周期は1サイクルの時間。IPCは1サイクルあたりの平均完了命令数です。
なぜそうなる?
違う命令が同時に違う段を使えば資源を空けずに済みます。ただしデータ依存、分岐、資源競合があると理想どおりには重なりません。
講義ノートで詳しく読む
元のMarkdownにある仕組み・図・用語を、順番に確認します。
1. CPU時間の見方
単純化したCPU実行時間は次の関係で考えられます。
実行時間 ≈ 命令数 × CPI × クロック周期
IPC = 1 / CPI (単純な平均として)
- 命令数:プログラム、コンパイラ、ISAなどに依存。
- CPI:1命令あたりの平均クロック数。
- クロック周期:1サイクルの時間。周波数の逆数。
異なるCPUでは1クロックに進む仕事量が異なるため、GHzだけでは比較できません。
2. パイプライン
洗濯を「洗う・乾かす・畳む」に分け、別の洗濯物を重ねて処理するのと似ています。
cycle: 1 2 3 4 5 6 7
I1: IF ID EX MEM WB
I2: IF ID EX MEM WB
I3: IF ID EX MEM WB
一命令が5段すべてを通る時間は残りますが、満杯になった後は理想的には毎サイクル1命令を完了できます。つまり主にスループットを改善します。
3. ハザード
データハザード
I1: ADD R1, R2, R3
I2: SUB R4, R1, R5
I2はI1の結果R1を必要とします。結果がレジスタへ戻るまで待つ方法はstallです。途中の演算結果を後続段へ直接渡す方法はforwardingまたはbypassingです。
制御ハザード
分岐結果が出るまで、次に取得すべき命令が分かりません。待つと性能が落ちるため、CPUは分岐方向と分岐先を予測します。
構造ハザード
複数命令が同じハードウェア資源を同時に必要とする競合です。資源を複製するか、どちらかを待たせます。
4. 分岐予測と投機実行
CPUは過去の傾向などから分岐先を予測し、その経路の命令を先に実行します。正しければ待ち時間を隠せます。外れた場合は誤った経路の結果を破棄し、正しい場所からやり直します。
投機実行はアーキテクチャ上の結果を勝手に変更してよいという意味ではありません。命令の完了は、プログラムから正しい順序に見えるよう管理されます。
5. アウト・オブ・オーダー実行
次の命令を考えます。
I1: LOAD R1, [slow_address]
I2: ADD R4, R2, R3 ; I1に依存しない
I3: MUL R5, R1, R6 ; I1に依存
I1のメモリ待ち中にI2を実行できます。CPUはデータ依存を追跡し、準備できた命令を先に実行します。最終的な確定はプログラム順に見えるよう管理します。
6. マルチコアとSMT
- マルチコア:物理的なCPUコアを複数搭載する。
- SMT:一つのコアで複数のハードウェアスレッド状態を持ち、実行資源の空きを利用する。
8コア16スレッドは、16個の完全な物理コアと同じではありません。またプログラム側が並列化できなければ、コアを増やしても速くなりません。
7. Amdahlの法則の直感
プログラムの20%が逐次処理として残るなら、並列部分を無限に高速化しても全体は最大5倍です。
最大高速化 = 1 / 逐次割合 = 1 / 0.2 = 5
GPUを使ってもCPU側の準備、データ転送、逐次部分が全体性能を制限することにつながります。
例題で確かめる
命令数10、平均CPIが2、クロック周期が1 nsの単純モデルで実行時間は?
- 命令数10に、1命令あたり2サイクルをかけて20サイクル。
- 20サイクル × 1 ns/サイクル。
答え:約20 ns。キャッシュ待ちなどはCPIの平均へ含めた単純化です。
実習
CPU/GPU対話型ラボのCPUタブを開きます。
- 5個の独立命令を流し、理想パイプライン表を作る。
- 直前結果に依存する命令を追加し、stallを1サイクル挿入する。
- 3命令目を分岐にし、予測失敗で後続2命令を破棄する図を作る。
- 「命令数」「完了までのサイクル」「理想IPC」を記録する。
説明課題
「5段パイプラインにすると、一命令が必ず5倍速くなる」という主張を訂正してください。
練習問題
元ノートの小テストです。まず自分で答えを考え、必要なら下の答えを開いてください。
パイプラインが主に改善するのはレイテンシーかスループットか。
答えと考え方を見る
主にスループット。
後続命令が直前命令の結果を待つ問題を何というか。
答えと考え方を見る
データハザード。
分岐予測失敗時、投機実行した誤経路の結果はどうなるか。
答えと考え方を見る
アーキテクチャ上の結果として確定させず破棄し、正しい経路から再実行する。
アウト・オブ・オーダー実行は何を利用して待ち時間を隠すか。
答えと考え方を見る
ある命令が待つ間に、依存せず準備できた別の命令を実行する。
20%が高速化不能なら、残りを無限に高速化した最大高速化率はいくつか。
答えと考え方を見る
1 / 0.2 = 5倍。