レジスタファイルとリネーミングの実装 ─ 物理レジスタとフリーリスト
リネーミングは「論理名と物理レジスタの貼り替え」に過ぎないと掴めば、発行幅やROB容量がなぜ頭打ちになるかが見えてきます。PRF方式・RAT・フリーリストの実装を内部動作から押さえられます。
- 1.リネーミングの実体はRAT(論理→物理の対応表)の貼り替えで、書き込み命令ごとにフリーリストから新しい物理レジスタを引き当ててWAR/WAWを消す。
- 2.現代の主流はPRF方式で、値は物理レジスタファイル一箇所に置きROBはタグだけ持つ。ROB方式は値をROB内に重複保持し、コミット時にARFへ転記する。
- 3.発行幅は『発行幅×2の読み出しポート+発行幅の書き込みポート』をレジスタファイルとRATが備える必要があり、ポート数とエントリ数が物理的な律速になる。
リネーミングは何を貼り替えているのか
アウトオブオーダ実行では、WAR/WAW という偽の依存をレジスタリネーミングで消すと述べました。本稿はその「消し方」を実装の高さで掘り下げます。
命令が指す r0〜r31 のような名前は アーキテクチャレジスタ(論理レジスタ、ISAが規定する名前)です。プロセッサ内部はそれより遥かに多い 物理レジスタ を持ち、値を実際に格納します。リネーミングの本質は、書き込み命令ごとに新しい物理レジスタを割り当て、論理名から物理名への対応表を更新することに尽きます。同じ r1 への二度の書き込みが別々の物理レジスタになるので、名前の衝突に過ぎなかった WAW/WAR が自然に消えるわけです。
元コード(論理レジスタ) リネーム後(物理レジスタ)
r1 = r2 + r3 p32 = p7 + p9
r4 = r1 * r5 → p33 = p32 * p11
r1 = r6 - r7 p34 = p13 - p15 ← r1を別物理に
r8 = r1 + r9 p35 = p34 + p17 ← 直近のr1=p34
3行目の r1 への再代入は、2行目の r1 とは別の物理レジスタ p34 になります。これで「1〜2行目の r1」と「3〜4行目の r1」が物理的に分離され、両者を並行実行できます。
RAT・フリーリスト・物理レジスタファイル
リネーミングを担うのは次の3つの構造です。
| 構造 | 役割 | 本数・幅 |
|---|---|---|
| RAT(リネームテーブル) | 論理→物理の現在の対応表 | 論理レジスタ数ぶんのエントリ |
| フリーリスト | 未使用の物理レジスタ番号の在庫 | 物理−論理ぶんが上限 |
| 物理レジスタファイル(PRF) | 値の実体を格納する記憶 | 論理数+実行中命令数ぶん |
RAT(Register Alias Table、マッピングテーブル)は論理レジスタ1本ごとに「今どの物理レジスタを指すか」を持つ小さな表です。フリーリスト は割り当て可能な物理レジスタ番号を貯めた待ち行列で、命令の割り当て(アロケート)で1本取り出し、不要になった物理レジスタの解放(フリー)で1本戻します。リネームの1サイクルは概ね次のように進みます。
1. ソース読み: 各ソース論理レジスタをRATで引き、現在の物理名を得る
2. デスティネーション割り当て:
フリーリストから新しい物理レジスタpNを1本取り出す
3. RAT更新: そのデスティネーション論理レジスタ → pN に書き換える
(旧マッピングはROBに退避し、解放時期の判定に使う)
ソース読みは「直近の生産者がどの物理レジスタか」を一発で引く操作で、これがリネームの心臓部です。
物理レジスタはアーキテクチャレジスタ数より多いとはいえ有限です。フリーリストが枯渇すると、書き込みを伴う命令はリネーム段で止まり、後続もろともストールします。つまり物理レジスタ数は、同時に「生きている」値の上限であり、命令ウィンドウの実効的な深さを直接律速します。物理レジスタを増やすほど多くの飛行中命令を抱えられますが、後述するポートと面積の代償が伴います。
PRF方式とROB方式 ─ 値をどこに置くか
リネーミングの実装には大きく2系統あります。違いは「投機中の値の置き場」です。
| 観点 | PRF方式(物理レジスタファイル) | ROB方式(リオーダバッファ内) |
|---|---|---|
| 値の格納場所 | PRFの一箇所に集約 | ROBエントリ内とARFに二重に存在 |
| ROBが持つもの | 物理レジスタ番号(タグ)のみ | 値そのもの+宛先論理番号 |
| コミット動作 | RATを正規版へ反映、値の移動なし | ROBからARFへ値をコピー |
| 値のコピー回数 | リタイアでコピー不要 | 毎リタイアでARFへ転記 |
| 代表例 | Intel Sandy Bridge以降、多くの現行設計 | Intel P6(Pentium Pro〜) |
ROB方式(P6型)は、まだコミットしていない結果を ROB エントリの中に保持し、別に ARF(Architectural Register File、確定値だけを持つレジスタファイル)を備えます。ソースオペランドは「ARFにある確定値」か「ROBにある未確定値」のどちらかから読むため、読み出し経路が二系統になり、コミットのたびに ROB から ARF へ値を転記します。
PRF方式 は値を物理レジスタファイル1箇所だけに置きます。確定値も投機中の値も同じ PRF に同居し、どれが確定済みかは RAT のもう一枚(後述の退避コピー)が区別します。ROB は値を持たず物理レジスタ番号というタグだけを記録するので ROB エントリが小さくなり、コミットでは値を動かさずマッピングを確定させるだけで済みます。大量の飛行中命令を抱える現代の広発行コアが PRF 方式を採るのは、この「値を動かさない」性質が幅とエントリ数のスケールに効くからです。
PRF方式で物理レジスタを返せるのは「その値を上書きする後続命令がコミットした瞬間」です。r1=p34 を r1=p50 で上書きする命令がコミットして初めて、p34 を待つ古い読み手はもう存在しないと確定し、p34 をフリーリストへ戻せます。だからリネーム段で旧マッピング(この例ではp34)をROBに退避しておき、上書き命令のコミット時に参照します。早すぎる解放は実行中の読み手の値を壊すため、解放時期は厳密にコミットへ紐付きます。
ポート数とエントリ数が発行幅を律速する
n命令を同時に発行・実行するには、レジスタファイルと RAT が1サイクルにそれだけの並列アクセスをさばけねばなりません。ここが実装上の最大の壁です。
- 読み出しポート:各命令が最大2つのソースを読むため、n発行なら最悪
2nポート要る。 - 書き込みポート:各命令が結果を1つ書くため、おおむね
nポート要る。
たとえば4発行なら、PRF に読み出し8・書き込み4の計12ポート級が必要になります。RAT も同様で、4命令ぶんのソースを同時に引き、4本のデスティネーションを同時に更新する マルチポートの連想構造 が要ります。
レジスタファイルの面積はおおよそ「エントリ数 × ポート数の二乗」に比例して膨らみます。各ビットセルが全ポートぶんのビット線・ワード線を引き回すため、ポートを1本増やすとセル全体が太り、配線が支配的になるからです。発行幅を倍にするとポート要求も倍になり、面積は二乗で効くので、レジスタファイルは広発行化の最も厳しい制約の一つになります。物理レジスタ数(エントリ)を増やすのも線形にコストが乗り、両者の積がアクセス遅延と消費電力を押し上げます。
このコストを避けるため、実機は様々な工夫を採ります。整数とベクトル/浮動小数で PRF を分離してポート競合を緩める、PRF を複数バンクに分けて全ポートが全エントリに同時到達しなくて済むようにする、レジスタの読み出しを発行段から実行直前へ後ろ倒しして同時読み出し数を平準化する、などです。いずれも「ポートとエントリの積」という物理的な律速を、構造分割でかわす方向の設計です。発行幅を支えるにはキャッシュの原理と同様、記憶構造のアクセス並列度をどう確保するかが核心になります。
誤投機時のRAT回復
分岐予測が外れたとき、誤った経路でリネームしてしまった RAT を、分岐時点の正しい状態へ戻す必要があります。これを誤らせると、解放済みの物理レジスタを再利用したり、生きた値を破壊したりして正しさが崩れます。回復方式は主に3つです。
| 回復方式 | やり方 | 速度とコスト |
|---|---|---|
| チェックポイント方式 | 分岐ごとにRAT全体のスナップショットを保存し、誤予測で丸ごと復元 | 回復は1サイクルと高速だが、スナップショット用の影RATが分岐数ぶん要る |
| ロールバック方式 | ROBを後ろから1エントリずつ巻き戻し、退避した旧マッピングをRATへ書き戻す | 面積は小さいが、巻き戻すエントリ数ぶんサイクルがかかる |
| リタイアRAT併用 | コミット済みの確定マッピングを別RATに常時保持し、誤予測時はそこから再構築 | 確定状態は即得られるが投機ぶんの再構築は要る |
チェックポイント方式 は分岐をリネームするたびに RAT 全体の影コピーを取り、誤予測が判明したら対応するチェックポイントを現用 RAT へ一括コピーします。回復は実質1サイクルで済む代わり、同時に飛ばせる分岐の数だけ影 RAT が要り、面積が増えます。ロールバック方式 はチェックポイントを持たず、ROB を誤分岐の直後まで1エントリずつ巻き戻しながら、各エントリに退避してある旧マッピングを RAT へ書き戻します。ハードは軽い反面、巻き戻すエントリが多いほど回復に時間がかかります。実機は分岐に限ってチェックポイントを置き、例外など稀な事象はロールバックで賄う、といった折衷を採ることが多いです。
「リネーミングの実体はRATの貼り替えで、書き込みごとにフリーリストから物理レジスタを割り当ててWAR/WAWを消す」「PRF方式は値をPRF一箇所に集約しROBはタグのみ、ROB方式は値をROB内に持ちコミットでARFへ転記」「発行幅nには読み出し約2n・書き込み約nのポートが要り、面積はポート数の二乗で効く」「誤投機回復はチェックポイントの即時復元かROBからのロールバック」。物理レジスタの解放がコミットに紐付く点も頻出です。
まとめ
- リネーミングの実体は RAT(論理→物理の対応表)の貼り替えで、書き込み命令ごとに フリーリスト から物理レジスタを引き当て、名前の衝突である WAR/WAW を消す。
- 主流の PRF方式 は値を物理レジスタファイル1箇所に集約し ROB はタグのみ持つ。ROB方式 は値を ROB 内に重複保持し、コミット時に ARF へ転記する。
- 発行幅nを支えるにはレジスタファイルと RAT に読み出し約
2n・書き込み約nのポートが要り、面積はポート数の二乗で膨らむため、ポートとエントリの積が物理的な律速となる。 - 誤投機時は RAT を分岐時点へ戻す必要があり、チェックポイントの即時復元か ROB からのロールバックで回復する。物理レジスタの解放はコミットに厳密に紐付く。
CPU/メモリ/ディスク Article
レジスタファイルとリネーミングの実装 ─ 物理レジスタとフリーリストを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
レジスタリネーミング
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
現代の主流はPRF方式で、値は物理レジスタファイル一箇所に置きROBはタグだけ持つ。ROB方式は値をROB内に重複保持し、コミット時にARFへ転記する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「レジスタリネーミング / 物理レジスタ」に近いか確認する。
- 強みである「リネーミングの実体はRAT(論理→物理の対応表)の貼り替えで、書き込み命令ごとにフリーリストから新しい物理レジスタを引き当ててWAR/WAWを消す。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。