問題
パイプライン処理を行うCPUにおいて、分岐命令で発生するパイプラインハザードの種類はどれか。
答え合わせ
- A
- B
- C
- D
自信の3択
えらぶと、この端末に記録します(登録はいりません)
解説
正解は「制御ハザード」です。
CPUのパイプラインは「料理を流れ作業で作る」イメージです。包丁係・炒め係・盛付係が同時並行で作業します。でも「次は何を作るか分からない」と全員手が止まります。これが分岐命令で起こる「制御ハザード」です。
- 構造ハザード:包丁が1本しかなくて取り合いになる(資源不足)
- データハザード:前の人が切った野菜を待つ(順番待ち)
- 制御ハザード:分岐で次の指示待ち(本問)
「分岐=制御の流れが変わる=制御ハザード」と覚えましょう。
正解は b「制御ハザード」です。
パイプライン処理では1命令を「フェッチ→デコード→実行→メモリアクセス→書き戻し」の5段階等に分割し、複数命令を並行処理します。理想的には1サイクルに1命令完了しますが、以下3種類のハザード(停滞)が発生します:
| ハザード | 原因 | 例 |
|---|---|---|
| 構造ハザード | ハードウェア資源の競合 | メモリポート不足 |
| データハザード | 命令間のデータ依存 | 前の演算結果を使う命令 |
| 制御ハザード | 分岐先が確定するまで命令フェッチが進められない | if文、ループ、関数呼出 |
本問の「分岐命令」は条件分岐や関数呼出で、分岐先アドレスがALUで計算されるまで「次の命令」が確定しません。確定までフェッチを止めるとパイプラインが空(バブル)になり性能が低下します。
緩和策:
- 分岐予測(Branch Prediction):過去の分岐結果から予測してフェッチ続行。予測ミス時はフラッシュ。現代CPUは95%以上の的中率。
- 遅延分岐(Delayed Branch):分岐の直後に「常に実行する命令スロット」を1つ設け、その間に分岐先を確定。SPARC等で採用。
- 投機的実行(Speculative Execution):両方の分岐を実行し、結果が出てから不要な方を破棄。Intel/AMDのスーパースカラCPUで標準。
データハザードはフォワーディング(オペランドのバイパス転送)やインターロック、構造ハザードはハードウェア多重化(複数ALU・複数メモリポート)で対策します。
AP午前ではCPUアーキテクチャの基礎として頻出(シラバス「コンピュータシステム・プロセッサ」)。
正解は b「制御ハザード」です。
制御ハザードはパイプライン化CPUの性能制約として古典的に研究されており、現代のスーパースカラ・アウトオブオーダ実行CPUでも依然として重要なテーマです。本問は基礎ですが、上級者として理解すべきは「分岐予測の進化」「投機実行の代償(Spectre/Meltdown)」「コンパイラとの協調」の3点です。
1. 分岐予測の進化
- 静的予測:「後方分岐は常にTake、前方分岐は常にNot Take」というコンパイル時の固定ルール。ループでは有効。
- 1bit予測:最後の結果を記録。1ループ抜けると2回連続でミスする弱点。
- 2bit飽和カウンタ:弱Take/強Take/弱NotTake/強NotTakeの4状態。1回のミスでは予測反転しない安定性を獲得。
- 2レベル予測(Yeh & Patt, 1991):分岐履歴レジスタ + パターン履歴テーブル。
- gshare(McFarling, 1993):グローバル履歴とPCのXORでPHTをインデックス。
- TAGE予測器(Seznec, 2006):複数履歴長のテーブルを使い分け。現代Intel/AMD CPUの内部実装の中核。
- ニューラル分岐予測(Jiménez, 2001〜):パーセプトロン分岐予測。AMD Ryzenが商用採用。
現代CPUの分岐予測的中率は98%超ですが、残り2%でも数千命令の投機実行が無駄になるためペナルティは大きいです(典型的に20〜30サイクル)。
2. 投機実行とサイドチャネル攻撃(Spectre / Meltdown)
2018年に公開されたSpectre(CVE-2017-5753, 5715)とMeltdown(CVE-2017-5754)は「分岐予測の結果として投機的に実行された命令が、本来アクセス不可なメモリの内容をキャッシュに残す」ことを利用したサイドチャネル攻撃です。
- Spectre v1:境界チェックを跨ぐ投機実行で配列外データを推測可能に
- Spectre v2:間接分岐の予測ターゲットを汚染(BTB Poisoning)
- Meltdown:カーネルメモリの投機読み込み
対策はマイクロコード更新(IBRS, STIBP, IBPB)とコンパイラ対策(Retpoline)が中心で、いずれもパフォーマンスに数%〜数十%の負担をかけました。これは「分岐予測精度の向上」と「セキュリティ」のトレードオフという新しい設計課題を生みました。
3. コンパイラとの協調
- __builtin_expect (GCC):if文の条件確率をコンパイラに伝え、静的予測のヒントとする。
- PGO(Profile-Guided Optimization):実行プロファイルを取得し、頻出パスを最適化。
- ループアンローリング:分岐回数を減らし制御ハザード自体を削減。
- ループ統合・分岐削減(branch elimination):条件付きmoveやpredicationで分岐を消去。
- LLVM `__attribute__((hot/cold))`:関数の頻度ヒント。
これらの最適化は「分岐予測に頼らず分岐自体を減らす」アプローチで、特にHPC・OS Kernel・JITコンパイラで重要視されます。
4. RISC-V と分岐削減
ARMv8 / x86_64 は条件付きmove (cmov, csel) を持ちますが、RISC-Vは最小限の命令セットを志向し条件付きmoveを基本ISAから除外しました(拡張Zicond で追加検討中)。これは「ハードウェア分岐予測で十分」という設計思想の表明ですが、実装の複雑さとのトレードオフが議論されています。
5. パイプライン段数と制御ハザードコスト
Intel NetBurst(Pentium 4)は31段パイプラインで分岐予測ミスのペナルティが極端に大きく、これがPentium 4失敗の一因でした。Core 2 で15段に短縮し回復。現代のIce Lake・Zen 4は14〜19段程度で、分岐予測精度の向上と組み合わせ性能を最大化しています。
実務的示唆:
- ホットループの内側で分岐を減らす(cmovで置換、ループ統合、分岐順序の最適化)
- 配列インデックスの境界チェックは投機実行を信頼せず、明示的にClampする(Spectre対策)
- 仮想関数の多用は間接分岐を増やし予測精度を下げる(CRTPやsealed classで静的化を検討)
AP午後問題でCPU性能改善の設計を問われた際、「分岐予測 + 投機実行 + キャッシュ階層」の3点セットを理解していると説得力のある回答が書けます。
出典と作り方
出典:IPA(情報処理推進機構)公式 応用情報技術者試験(AP) 令和6年度 秋期 問1/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。

