投機実行とリカバリ ─ チェックポイントとミスペナルティ
分岐を当てれば速いが、外せば数十サイクルが消える。誤予測をどう検出し、RAT復元とパイプラインフラッシュで状態をどう巻き戻すのか、回復の原理とコストを内部動作から掴めます。
- 1.投機した命令は分岐・メモリ・例外の各境界に投機タグやチェックポイントを刻み、誤予測が判明したらその境界より後ろをまとめて捨てる。
- 2.回復の核はRAT(リネームテーブル)の復元。分岐ごとのチェックポイントを保存しておけば1サイクルで巻き戻せ、無ければROBを逐次たどって再構築する。
- 3.ミスペナルティは検出からフロントエンド再起動までの空白で、最近のコアでは15〜20サイクル超。フラッシュ・物理レジスタ回収・命令フェッチ再開の合計が回復コストになる。
投機は「取り消せる」前提で走る
アウトオブオーダ実行のコアは、分岐の結果が確定する前に予測方向へ命令を流し込み続けます。これが投機実行です。投機が当たれば分岐のレイテンシは隠れますが、外れたとき、すでにパイプラインに入った数十〜百命令を「無かったこと」にできなければ正しさが壊れます。
つまり投機実行の設計は、速く走らせることと同じくらい、間違ったときに副作用なく巻き戻す仕組みが本体です。鍵は、投機で進んだ命令がアーキテクチャ状態(プログラムから見えるレジスタとメモリ)に触れないこと、そして「どこまで戻すか」を正確に記録しておくことの2点にあります。
何を投機しているのか ─ 3つの境界
投機は分岐だけではありません。順不同コアでは、確定前に先へ進む判断が複数あり、それぞれ別の追跡が要ります。
| 投機の種類 | 予測している事柄 | 誤りの検出点 | 回復の単位 |
|---|---|---|---|
| 制御投機 | 分岐の方向・飛び先 | 分岐の実行・解決時 | 分岐境界より後ろ |
| メモリ投機 | ロードと先行ストアが別アドレス | ストアアドレス確定時 | 違反ロード以降 |
| 例外をまたぐ投機 | 命令が例外を起こさない | 実行・コミット直前 | 例外命令より後ろ |
制御投機は予測した分岐方向に賭けるもので、誤予測ペナルティの主因です。メモリ投機は、アドレス未確定の先行ストアを飛び越してロードを先に実行する判断で、後でアドレスが衝突したと分かるとメモリオーダ違反になります(ロードストアキューとメモリ曖昧性除去の領域)。例外をまたぐ投機は、ページフォルトや無効命令を起こしうる命令の後ろも先に流すことで、コミット段で正確な例外(precise exception)として処理します。
発行された各命令には、自分がどの未解決分岐の予測の下にいるかを示す投機タグ(ブランチマスク)が付きます。複数の分岐をまたいで投機しているときは、命令はそれら全部の配下にあるため、複数ビットのマスクを持ちます。ある分岐が誤予測と判明したら、そのビットを含む命令を一括で無効化でき、正しかった分岐の配下の命令は生き残れます。
回復の核心はRATの復元
投機を巻き戻すとき、最も復元が難しいのは**RAT(Register Alias Table、リネームテーブル)**です。RATは論理レジスタ→物理レジスタの現在の対応で、命令を発行するたびに更新されます。誤予測した分岐の後ろで何十回も書き換わっているので、これを分岐時点へ戻さなければ、以後の命令が誤った物理レジスタを読みます。詳しい構造はレジスタファイルとリネーミングの実装を参照してください。復元には主に2方式があります。
| 方式 | やり方 | 回復レイテンシ | コスト |
|---|---|---|---|
| チェックポイント方式 | 分岐ごとにRAT全体を退避し、誤予測時に丸ごと復元 | 1サイクル | 分岐ごとのRATコピー(面積大) |
| ROBウォーク方式 | ROBを誤予測点まで逆順にたどり旧マッピングを戻す | 数〜数十サイクル | 退避領域は不要だが低速 |
チェックポイント方式は、分岐を発行する瞬間にRATのスナップショットを撮っておき、誤予測が判明したら該当チェックポイントを1サイクルでロードします。高速ですが、同時に投機できる分岐の数だけRATの複製が要るため、チェックポイント数(典型的に8〜16)が投機できる未解決分岐数の上限になります。これを使い切ると新たな分岐を発行できずフロントエンドが止まります。
ROBウォーク方式はスナップショットを持たず、誤予測点までROBのエントリを末尾から逆にたどり、各命令が上書きする前の旧物理レジスタ番号(リネーム時に記録しておく)でRATを戻します。面積は小さい代わりに、戻すべき命令の数だけサイクルを食います。実装では、頻度の高い条件分岐にはチェックポイント、稀な例外にはROBウォーク、と使い分けるハイブリッドが一般的です。
検出からフロントエンド再起動まで
誤予測が起きてから正しいフェッチが再開するまでの流れを、サイクル順に追います。
1. 解決(Resolve) : 分岐が実行ユニットで本当の方向を計算。
予測タグと比較し、不一致なら誤予測フラグ。
2. フラッシュ(Flush): 誤分岐より後ろのROB/RS/LSQエントリを無効化。
投機タグの一致するエントリを一括クリア。
3. RAT復元 : チェックポイントをロード、または旧マップを書き戻す。
4. 物理レジスタ回収 : 破棄した命令が確保した物理レジスタを
フリーリストへ返却(マップ復元と同時に処理)。
5. リダイレクト : 正しい飛び先アドレスをフェッチユニットへ。
6. 再フェッチ : 空のパイプラインに正しい命令を流し始める。
ここで重要なのは、フラッシュは投機した命令だけを消し、誤分岐より前の命令には触れないことです。ROBは命令をプログラム順に並べたFIFOなので、「誤分岐のROBエントリより後ろ」という範囲が一意に決まり、その範囲を一括で無効化します。アーキテクチャ状態はコミット段でしか更新されず、投機命令はまだコミットしていないため、レジスタもメモリも汚れていません。だから破棄は安全です。
投機実行中のストアは、絶対にキャッシュやメモリへ書いてはいけません。書いてしまえば巻き戻せないからです。ストアはストアバッファに保持され、その命令がコミットされて初めてキャッシュへ書き出されます。誤予測でフラッシュされたストアは、バッファごと捨てれば外部から観測されません。投機ロードがバッファ内の未コミットストアから値を得る転送(store-to-load forwarding)も、この段で完結します。
ミスペナルティの正体と内訳
分岐誤予測の代償は、しばしば「パイプライン段数」と説明されますが、実際のミスペナルティはもっと多くの要素の和です。
- 検出までの距離:分岐がデコードからどれだけ後段で解決するか。オペランドが揃わず実行が遅れるほど、投機した無駄命令が積み増される。
- フラッシュとRAT復元:チェックポイント方式なら1〜数サイクル、ROBウォークなら戻す命令数に比例。
- フロントエンドの再充填:正しい飛び先のフェッチからデコード・リネームを経て実行に届くまでの、深いフロントエンドパイプラインの空白。
これらの合計が、最近の深いコアでは15〜20サイクル超に達します。実効的な損失は予測ミス率にこのペナルティを掛けたものなので、分岐予測の精度向上と、ミスペナルティ自体の短縮(早期分岐解決、高速なRAT復元)の両輪で攻めます。
ミスペナルティの一部は「誤った道を進んだ命令数」に比例します。分岐のオペランドが早く揃い、できるだけ前段で方向を確定できれば、無駄に投機する命令が減り、フラッシュ対象も小さくなります。分岐の入力を生むのが長レイテンシのロードだと解決が遅れるため、クリティカルな分岐の被依存ロードを優先実行するなどのスケジューリング工夫が効きます。
「投機命令はコミットまでアーキテクチャ状態に触れないから安全に破棄できる」「回復の核はRAT復元で、チェックポイント方式は高速だが分岐数に上限、ROBウォークは安価だが低速」「ミスペナルティは段数だけでなく、検出距離・フラッシュ・フロントエンド再充填の和」の3点が頻出です。実行は投機的・コミットは確定的、という分離を押さえましょう。
まとめ
- 投機実行は制御・メモリ・例外の3境界をまたいで先へ進み、各命令は配下の未解決分岐を投機タグで持ち回るため、誤予測時にその範囲だけを一括無効化できる。
- 回復の中心はRATの復元で、分岐ごとのチェックポイントなら1サイクル、ROBウォークなら戻す命令数に比例し、両者を使い分けるのが実装の定石。
- フラッシュは誤分岐より後ろのROB/RS/LSQと物理レジスタだけを対象とし、未コミットのストアはストアバッファで堰き止めるため、メモリもレジスタも汚れない。
- ミスペナルティは検出距離・フラッシュ/RAT復元・フロントエンド再充填の和で、深いコアでは15〜20サイクル超。予測精度とペナルティ短縮の両輪で実効損失を抑える。
CPU/メモリ/ディスク Article
投機実行とリカバリ ─ チェックポイントとミスペナルティを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
投機実行
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
回復の核はRAT(リネームテーブル)の復元。分岐ごとのチェックポイントを保存しておけば1サイクルで巻き戻せ、無ければROBを逐次たどって再構築する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「投機実行 / 分岐予測」に近いか確認する。
- 強みである「投機した命令は分岐・メモリ・例外の各境界に投機タグやチェックポイントを刻み、誤予測が判明したらその境界より後ろをまとめて捨てる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。