TL

分岐予測の仕組み ─ 2bitカウンタからTAGEまで

なぜ現代CPUは分岐の結末を待たずに走り続けられるのか。飽和カウンタからTAGEまでの予測機構と誤予測コストを原理から押さえ、IPCを左右する勘所を掴めます。

応用分岐予測投機実行TAGEBTBパイプラインIPC最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.分岐の方向が確定するのはパイプライン後段なので、CPUは投機的に先へ進む。外すとフラッシュで十数サイクルが無駄になり、IPCが直接削られる。
  • 2.予測は2bit飽和カウンタを起点に、履歴で索引するgshare、複数器を使い分けるトーナメント、可変長履歴を競わせるTAGEへと精度を高めてきた。
  • 3.方向だけでなく飛び先も当てる必要があり、BTBが分岐先を、RASが関数の戻り先を供給する。これらが揃って初めて投機実行が成立する。

なぜ分岐を「予測」しなければならないか

パイプライン化されたCPUは、ある命令を実行している最中に後続命令のフェッチ・デコードを先行して進めます。ところが条件分岐は、その条件がパイプラインの後段(実行ステージ)で計算されて初めて方向が確定します。フェッチ段から見れば「次にどのアドレスを取りに行くか」が、数サイクル先まで分からないわけです。

ここで分岐の確定を待って止まれば、毎回その分のサイクルが空きます。プログラムの数命令に1回は分岐があるため、待っていてはパイプラインが頻繁に空転します。そこで分岐予測で結末を当て、当たった前提で投機的にフェッチを続けます。当たれば停止ゼロ、外れたら後述のフラッシュで取り消す――この賭けの精度こそが実効IPCを左右します。

誤予測のコストが精度を要求する

予測を外すと、誤った経路で投機実行した命令をすべて破棄し、正しい経路から取り直します。これがパイプラインフラッシュです。

誤予測ペナルティはパイプライン長に比例する

フラッシュ後、正しい命令が再び実行段に届くまでにかかるサイクル数が誤予測ペナルティです。これはおおむねフロントエンドのパイプライン段数に比例し、現代の深いパイプラインでは15〜20サイクル前後に達します。アウトオブオーダ実行で投機をさらに深く進めるほど、外したとき破棄する仕事も増え、ペナルティの実効コストは膨らみます。

精度が性能をどう削るかは概算できます。分岐の頻度を5命令に1回、誤予測ペナルティを15サイクルとすると、予測精度が95%なら命令あたり 0.2 × 0.05 × 15 = 0.15 サイクルの損失、99%なら 0.2 × 0.01 × 15 = 0.03 サイクルです。わずか4ポイントの精度差が、5倍の浪費差になります。だからこそ予測器は1%を削るために複雑化してきました。

2bit飽和カウンタ ── 予測の最小単位

最も基本的な予測は、分岐ごとに2bit飽和カウンタを持つ方式です。値は「強Not-Taken/弱Not-Taken/弱Taken/強Taken」の4状態で、Takenなら+1、Not-Takenなら−1し、両端で飽和(それ以上動かない)します。上位ビットが予測(Takenかどうか)です。

00 強NT ─Taken→ 01 弱NT ─Taken→ 10 弱T ─Taken→ 11 強T
 ↑__NotTaken___|___NotTaken___|___NotTaken___|
予測 = 上位ビット(0:NotTaken / 1:Taken)

1bit(直前の結果をそのまま予測)だと、ループの最後で1回外し、次のループ初回でまた外す「二重ミス」が起きます。2bitなら1回の例外では予測が反転しないため、ループのような偏った分岐に強くなります。この履歴を集めた表を**PHT(Pattern History Table)**と呼びます。

履歴で索引する ── gshareと相関予測

2bitカウンタは「この分岐は普段どうか」しか見ません。しかし実際の分岐は、直前の他の分岐がどうだったかと相関することが多くあります(例:if (x) ... if (x) ... のように同じ条件が連動する場合)。

そこで**グローバル履歴レジスタ(GHR)**に直近N個の分岐結果をビット列として保持し、これをPHTの索引に使います。gshareは、分岐アドレスとGHRを XOR して索引を作る代表的な方式です。

index = (分岐PC) XOR (グローバル履歴GHR)
PHT[index] の2bitカウンタで予測

アドレスと履歴を混ぜることで、同じ履歴でも分岐ごとに別エントリへ散らし、限られた表を有効活用します。ただしXORは衝突(別々の分岐が同じエントリを共有するエイリアシング)を完全には防げず、これが精度の頭打ちの一因になります。

トーナメント予測 ── 得意を使い分ける

分岐には、自身の履歴(ローカル)が効くものと、他分岐との相関(グローバル)が効くものが混在します。どちらか一方では取りこぼします。

予測器索引に使う情報得意な分岐
ローカル予測その分岐自身の過去パターン周期的・自己相関の強い分岐
グローバル予測(gshare等)直近の他分岐の履歴条件が連動する相関分岐
メタ予測(選択器)どちらが当ててきたかの履歴分岐ごとに最適器を選ぶ

トーナメント予測は、ローカル予測器とグローバル予測器を両方走らせ、**メタ予測器(選択器)**が「この分岐では最近どちらが当たっているか」を2bitカウンタで覚えて採用側を切り替えます。Alpha 21264が採用したことで知られ、単一方式の弱点を補い合う構成として広く影響を与えました。

TAGE ── 可変長履歴を競わせる

現代の高性能コアの主力が**TAGE(TAgged GEometric history length)**です。核心は、幾何級数的に異なる長さの履歴で索引する複数のテーブルを並べ、最も信頼できるものを選ぶ点にあります。

各テーブルは「短い履歴で索引する表」「やや長い履歴の表」…と、履歴長が 4, 8, 16, 32, … のように伸びていきます。各エントリは予測カウンタに加えてタグ(その履歴に本当に対応するかの照合用)と**有用度(useful)**ビットを持ちます。

予測時:
  ベース予測器(履歴なしの2bit表)が既定値を出す
  各TAGEテーブルをタグ照合し、ヒットした中で
  「最も長い履歴で索引した表」の予測を採用する
学習時:
  外したら、より長い履歴の表に新エントリを割り当てて
  次回はその長い文脈で当てにいく

短い履歴で足りる分岐は短い表で当て、長い文脈が要る難しい分岐だけ長い履歴の表に任せる――この長い履歴ほど優先という原理で、必要な分岐にだけ長文脈を使い、表を無駄なく配分します。タグ照合で誤った文脈の流用(エイリアシング)を抑えられるのも、gshareに対する大きな改善点です。

ニューラル分岐予測(パーセプトロン)

もう一つの系譜が、履歴ビットを重みで線形結合し符号で判定するパーセプトロン予測です。長い履歴を表の指数的増大なしに扱える利点があり、実装ではTAGE系と組み合わせて(TAGEを主、パーセプトロンを補正に)使う構成も見られます。どちらも「長い相関を安く捉える」という同じ課題に答えています。

方向だけでなく「飛び先」も当てる

方向(Taken/Not-Taken)を当てても、Takenならどこへ飛ぶかが分からなければフェッチを続けられません。これを供給するのが次の2つです。

  • BTB(Branch Target Buffer):分岐PCをキーに、その分岐の飛び先アドレスをキャッシュする表。フェッチ段で「この命令は分岐か、飛び先はどこか」を1サイクルで引けるようにする。BTBミスやキャッシュ同様の容量制約は、それ自体が遅延要因になる。
  • RAS(Return Address Stack):関数の戻り先専用の小さなLIFOスタック。call で戻り先をプッシュ、return でポップして飛び先を予測する。戻り先は呼び出し元ごとに変わるためBTBでは当てにくく、専用スタックが効く。
間接分岐という難所

switch文の飛び先テーブルや仮想関数呼び出し(vtable経由)は、同じ命令が実行ごとに異なるアドレスへ飛ぶ間接分岐です。単純なBTBは直前の飛び先しか覚えられず外しやすいため、履歴で飛び先を索引するITTAGEなどの専用予測器が用いられます。多態なコードで分岐予測ミスが増えやすいのはこのためです。

試験のポイント

「2bit飽和カウンタは1回の例外で予測が反転しないためループに強い」「gshareは分岐PCとグローバル履歴のXORで索引する」「トーナメントはメタ予測器でローカル/グローバルを選択」「TAGEは長さの異なる履歴の表を持ち、最長ヒットを優先」「方向はPHT、飛び先はBTB、戻り先はRAS」という対応を押さえましょう。誤予測ペナルティがパイプライン段数に比例する点も頻出です。

まとめ

  • 分岐方向は後段でしか確定しないため投機実行が必要で、誤予測のフラッシュ(十数サイクル)がIPCを直接削る。精度1%の差が浪費を大きく変える。
  • 予測は2bit飽和カウンタ(PHT)を起点に、グローバル履歴で索引するgshare、得意を使い分けるトーナメント、可変長履歴を競わせるTAGEへと精度を高めてきた。
  • 方向予測に加え、飛び先をBTBが、関数の戻り先をRASが供給し、間接分岐にはITTAGE等を使う。これらが揃って投機実行が成立する。
  • 予測器の改良はエイリアシング削減と長相関の安価な捕捉に集約され、深いパイプラインと広い投機を支える土台になっている。

CPU/メモリ/ディスク Article

分岐予測の仕組み ─ 2bitカウンタからTAGEまでを実務で読む

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

解決すること

分岐予測

比較で見る軸

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

導入後に効く点

予測は2bit飽和カウンタを起点に、履歴で索引するgshare、複数器を使い分けるトーナメント、可変長履歴を競わせるTAGEへと精度を高めてきた。

先に潰すリスク

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

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

判断チェックリスト

  • 自社の用途が「分岐予測 / 投機実行」に近いか確認する。
  • 強みである「分岐の方向が確定するのはパイプライン後段なので、CPUは投機的に先へ進む。外すとフラッシュで十数サイクルが無駄になり、IPCが直接削られる。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

分岐予測投機実行TAGEBTBパイプライン分岐予測投機実行TAGE
参考: 公式情報