TL

命令パイプラインの原理 ─ ステージ分割とハザード

なぜCPUは1サイクルに1命令を捌けるのか。古典5段パイプラインを起点に、3種のハザードとフォワーディング・ストールの解決原理を、設計判断ごと押さえられます。

応用パイプラインハザードフォワーディング分岐予測CPI最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.パイプラインは命令処理をIF/ID/EX/MEM/WBへ分割し、各ステージを別命令で同時に埋めることでスループットを上げる。理想CPIは1だが実際は1より大きい。
  • 2.ハザードは構造(資源競合)・データ(先行命令の結果待ち)・制御(分岐先の不確定)の3種で、放置すると誤った実行か待ちを招く。
  • 3.データはフォワーディングで結果を演算器へ直接転送し、load-use等の残りはストール、制御は分岐予測と遅延スロットで隠してCPI=1へ近づける。

なぜステージに分けるのか

1命令の処理は「命令を取る・解読する・計算する・メモリを触る・結果を書く」という工程に分けられます。これを1サイクルで全部やると、サイクル時間は全工程の合計遅延で決まり、しかも各工程の回路は1命令ぶんの時間しか働かず大半が遊びます。

パイプラインは処理をステージに区切り、ステージ間にラッチ(パイプラインレジスタ)を挟みます。古典的な RISC の5段構成はこうです。

IF  命令フェッチ      命令メモリ/I-cacheから命令を読む
ID  デコード/レジスタ読  命令を解読し、レジスタファイルからオペランドを読む
EX  実行             ALUで演算、または実効アドレスを計算
MEM メモリアクセス     ロード/ストアでデータメモリ/D-cacheを触る
WB  ライトバック       結果をレジスタファイルへ書き戻す

各ステージは異なる命令を同時に担当します。定常状態では5命令が並走し、毎サイクル1命令ずつ完成します。サイクル時間は最も遅い1ステージで決まるため、理想的にはスループットが段数倍に近づきます。

レイテンシは縮まない、スループットが上がる

1命令が IF から WB を通り抜ける時間(レイテンシ)はむしろ増えます。パイプラインが速くするのは単位時間あたりの完了数=スループットです。段数を増やせばサイクル時間は短くなりますが、ラッチ遅延とハザード頻度が増えるため、深ければ深いほど速いわけではありません。

理想性能の指標が CPI(Cycles Per Instruction) で、完璧に詰まれば 1 です。だが実際には、後続命令を素直に流せない事態=ハザードが起き、CPI は 1 より大きくなります。

構造ハザード:資源が足りない

構造ハザードは、同一サイクルで複数の命令が同じハードウェア資源を奪い合うときに起きます。典型は、命令メモリとデータメモリが分離していない構成です。ある命令が MEM でデータを読む同じサイクルに、別の命令が IF で命令を読もうとすると、単一ポートのメモリでは両立しません。

解決は資源の重複か分離です。命令キャッシュとデータキャッシュを分けるハーバード型にすれば IF と MEM が衝突しません。レジスタファイルも、ID の読みと WB の書きが同サイクルで起きるため、書き込みを前半サイクル・読み出しを後半サイクルに分けるなどで両立させます。多くの教科書的5段が構造ハザードを「設計で消える」前提に置けるのは、こうした資源分離を最初から織り込んでいるからです。

データハザード:結果がまだ無い

データハザードは、先行命令がまだ書いていない結果を後続命令が読もうとする依存(特に RAW: Read After Write)から生じます。

add r1, r2, r3   ; r1 を WB で書くのは4サイクル後
sub r4, r1, r5   ; 次サイクルの ID で r1 を読みたい → まだ古い値

add が r1 を WB で書き戻すのは数サイクル先ですが、sub はその前に ID で r1 を読みます。素直に流すと古い値を掴みます。

鍵は、結果はレジスタに書かれる前に EX の出口(ALU出力)には既に存在していることです。そこで結果をレジスタファイル経由ではなく、後続命令の演算器入力へ直接配線で送り込むのが**フォワーディング(バイパス)**です。EX/MEM ラッチや MEM/WB ラッチの値を ALU 入力へ戻すマルチプレクサを置き、依存を検出したらそちらを選びます。

依存の種類意味主な解決
RAW(真の依存)先行の書き込みを後続が読むフォワーディング+必要時ストール
WAR(逆依存)先行の読みより先に後続が書くインオーダー5段では発生しない
WAW(出力依存)同じレジスタへ二重書き込みインオーダー5段では発生しない

フォワーディングで多くの RAW は消えますが、ロード命令だけは別です。ロードの結果が確定するのは MEM の終わりで、直後の命令が EX で必要とするタイミングに1サイクル間に合いません。これを load-use ハザードと呼びます。

lw  r1, 0(r2)    ; r1 が確定するのは MEM の後
add r4, r1, r5   ; 次命令の EX に r1 が間に合わない → 1サイクル停止

ここだけは**ストール(バブル挿入)**が要ります。ハザード検出ユニットが load-use を見つけると、後続を1サイクル止め、空のステージ(バブル)を流します。コンパイラが間に無関係な命令を1つ並べ替えて挟めれば、このストールを消せます。

フォワーディングは万能ではない

フォワーディングは「もう計算済みの結果」を早く渡すだけで、まだ存在しない結果は前倒しできません。だから ALU 結果は前倒しできても、メモリから来るロード結果は1サイクル分だけストールが残ります。深いパイプラインでは EX が複数段になり、フォワーディング経路と残るストールがさらに増えます。

制御ハザード:次にどこへ飛ぶか

分岐命令は、次に IF すべきアドレスが分岐の結果を見るまで確定しない問題を起こします。これが制御ハザードです。分岐の成立可否や飛び先が EX 付近まで分からないと、その間に IF した後続命令が無駄になり、捨てる(フラッシュ)必要があります。捨てた数ぶんが分岐ペナルティです。

解決原理は大きく3つです。

  • 早期確定:分岐の判定と飛び先計算を ID 段まで前倒しし、ペナルティを1サイクルに圧縮する。比較器と加算器を ID に追加するコストと引き換えです。
  • 分岐遅延スロット(遅延分岐):分岐直後の1命令は分岐の成否に関わらず必ず実行するとアーキテクチャで定義し、その枠をコンパイラが有用な命令で埋める。初期 MIPS が採った方式で、ハードは単純になりますが、深いパイプラインでは枠が足りず時代遅れになりました。
  • 分岐予測:成立/不成立と飛び先を予測して投機的に流し、外れたら破棄する。深いパイプラインの主流で、的中率が CPI を直接左右します。
投機実行はやり直しが効く範囲で

予測ミス時は、誤って取り込んだ命令を WB に到達させる前にすべて無効化します。レジスタやメモリへ確定的に書く前だから安全に捨てられる、という前提が重要です。誤って投機した結果が観測可能な副作用(キャッシュ状態など)を残すと、Spectre 系の脆弱性の温床になります。

予測の質を支えるのが履歴です。分岐先を覚える BTB(Branch Target Buffer)と、成立傾向を学ぶ2ビット飽和カウンタやグローバル履歴を組み合わせ、現代の予測器は数十命令ぶんの投機を支える的中率を出します。この投機を順序を超えて推し進めたのがアウトオブオーダー実行で、5段の枠を越えて並列度を引き上げます。

CPI=1へ近づける設計判断

実効 CPI は概ね次の積み上げで決まります。

実効CPI ≒ 1 + (load-useストール率) + (分岐予測ミス率 × ミスペナルティ)
            + (キャッシュミス率 × ミスペナルティ) + 構造ハザード起因の停止

設計判断はこの各項を削る営みです。資源を分離して構造項を消し、フォワーディング網でデータ項をほぼ消し、残る load-use はコンパイラのスケジューリングで埋める。制御項は予測器の精度向上で抑えます。キャッシュミス項はキャッシュメモリの原理が扱う領域で、ミスペナルティの大きさはパイプラインを直撃します。

試験のポイント

「理想CPIは1、ハザードで1より大きくなる」「RAWはフォワーディングで多くが解消、load-useだけは1ストール残る」「インオーダー5段ではWAR/WAWは起きない」「分岐ペナルティは分岐解決を早めるか予測で隠す」の4点が頻出です。フォワーディングとストールの守備範囲の違いを取り違えないこと。

まとめ

  • パイプラインは処理を IF/ID/EX/MEM/WB に分割し、各ステージを別命令で埋めてスループットを上げる。理想 CPI は 1。
  • 構造ハザードは資源分離(ハーバード型キャッシュ、レジスタの read/write 分離)で設計上消す。
  • データハザード(RAW)はフォワーディングで大半を解消し、load-use だけは1サイクルのストールが残る。
  • 制御ハザードは分岐の早期確定・遅延スロット・分岐予測で隠し、予測精度が実効 CPI を支配する。

依存をさらに動的に追い越す仕組みはアウトオブオーダー実行へ、投機実行と表裏一体の可視性順序の話はメモリオーダリングとバリアへ続きます。

CPU/メモリ/ディスク Article

命令パイプラインの原理 ─ ステージ分割とハザードを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

パイプライン

比較で見る軸

難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 5

導入後に効く点

ハザードは構造(資源競合)・データ(先行命令の結果待ち)・制御(分岐先の不確定)の3種で、放置すると誤った実行か待ちを招く。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
CPU/メモリ/ディスク
タグ数
5

判断チェックリスト

  • 自社の用途が「パイプライン / ハザード」に近いか確認する。
  • 強みである「パイプラインは命令処理をIF/ID/EX/MEM/WBへ分割し、各ステージを別命令で同時に埋めることでスループットを上げる。理想CPIは1だが実際は1より大きい。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

パイプラインハザードフォワーディング分岐予測CPIパイプラインハザードフォワーディング
参考: 公式情報