前回の続き:msyksphinz.hatenablog.com
更新則に入る前に、まず「予測時に何が起きているか」を整理する。これは TAGE の理解に必須である。
1. 入力:PCとGHR
- PC:予測対象分岐のアドレス(通常は下位のアラインメントビットを除く)
- GHR:過去の分岐結果列(グローバル履歴)
2. テーブルごとの index / tag 生成
各テーブル $T_i$ は履歴長 $L_i$ を持つ(幾何級数)。まず履歴を固定幅に圧縮し、PCと混ぜて index と tag を作る。
- $G_i=\text{fold}(GHR,L_i)$(圧縮履歴)
- $idx_i = \text{hash}(PC, G_i)$
- $tag_i = \text{hash2}(PC, G_i)$
圧縮履歴(fold)は、長い履歴をそのまま利用できないための実装上の工夫である。
3. テーブル参照とヒット判定
テーブル $T_i$ から idx_i のエントリを読み出し、タグ一致を確認する。
- 読み出し:
Ti[idx_i] -> {stored_tag, pred_ctr, u} - ヒット:
stored_tag == tag_i
ヒットしたテーブルは「このPC+履歴文脈に対応するエントリが存在する」と解釈される。
4. provider / alternate の選択
TAGEの合成の要点は “選択” である。
- provider:ヒットした中で最長履歴(最大 i)
- alternate:次点のヒット(無ければ base=T0)
予測は原則 provider の pred_ctr で決めるが、実用実装では provider が弱い場合や新規割当直後などに alternate を選ぶ規則を持つことがある。ここが更新則の設計と密接に結びつく。