TAGE条件分支方向预测器
TAGETAggedGEometric history length predictor是 Seznec Michaud 在 2006 年提出的条件分支方向预测器核心思想是用 PC 多长度全局历史并行寻址一组带 tag 的 SRAM 表只在 tag 真正匹配去别名的表里选历史最长者作预测。下面按为什么这样设计 → 硬件结构 → 预测流程 → 更新策略四步讲清楚。1. 为什么需要 TAGE历史长度的矛盾分支行为可看成{PC, 历史序列}的函数。历史太短 → 抓不到嵌套循环/长相关历史太长 → 状态空间爆炸、预热warm-up慢、不同分支容易哈希到同一项alias。传统做法的缺陷GShare / 单一长度全局预测历史长度固定长短相关不能兼顾。O-GEHL用几何级数历史长度的多个表求和但表项不带 tag长历史下 alias 严重分不清这次命中是不是真同场景。PPM-like带 tag但没用几何级数历史。TAGE 把两者合起来几何级数历史长度 部分 tag 匹配 最长命中优先。2. 硬件结构1 个 Base M 个 Tagged 表2.1 表组成T0Base Predictor不带 tag直接用 PC 低位是索引存2-bit 饱和计数器双模态。作为兜底预测altpred 的退路。Tii1..MTagged Components每个 Ti 对应一个不同的历史长度 L(i)L(i) 成几何级数L(i) int(α^(i-1) * L(1) 0.5)α≈2例如 8/16/32/64/128/256…表项字段典型值tag7~12 bit随历史变长而加宽—— 部分 tag用来判是否真命中ctr3-bit 有符号饱和计数器符号位给方向其余给置信度u2-bit 无符号 useful counter标记该表项是否有用兼作老化/替换依据2.2 索引与 tag 的生成对 Ti把PC 和折叠folded后的全局历史 GHR 低 L(i) 位 做哈希一套哈希 →index定位 SRAM 行另一套或同种不同折叠哈希 →tag与读出项里的 tag 比对折叠历史history folding是把长 GHR 分段异或压缩到固定宽度再和 PC 异或避免直接把几百位历史送进哈希。所有 T0~TM并行访问一拍出 index下一拍读 SRAM 比 tag。3. 预测流程最长命中优先对当前分支 PC 和当前 GHR并行读 T0 和 T1..TM。对每个 Ti比较算出的 tag 读出项的 tag相等且 valid1 算hit。在所有 hit 的 Ti 中选L(i) 最大 的那张表记为provider component它的ctr符号位就是预测方向。若没有任何 Ti hit → 用 T0 的 2-bit 计数器结果。altpred备选预测定义如果 provider 是 Tk则 altpred 次长命中的 Ti 的预测若只有 Tk hitaltpred T0。伪代码pred T0.predict() # base altpred T0.predict() provider none for i M downto 1: if Ti.tag_match: altpred (provider ? provider.ctr_sign : T0.predict()) provider Ti break if provider: # 新分配项弱预测时可临时用 altpredUSE_ALT_ON_NA 机制 if provider.ctr is weak and USE_ALT_ON_NA 0: pred altpred else: pred provider.ctr_sign else: pred T0.predict()为什么最长命中优先合理能命中更长历史的表说明当前场景在更长上下文里出现过且没被 alias 冲掉置信度天然更高短历史表命中只说明粗粒度像长历史表是更细粒度的匹配。4. 更新策略预测完、分支退休时4.1 ctr 更新provider 的ctr按实际结果饱和加减对则加朝强错则减朝反。若 provider 的u0说明还没证明自己有用顺便也更新 altpred 的 ctr加速备用表学习。4.2 useful 计数器 u 更新仅当altpred ! pred时即 provider 和备选意见不一致这时 provider 的对错才有区分度实际结果 pred → provider.u实际结果 ! pred → provider.u--u 会周期性平滑复位先清 MSB 再清 LSB防止某项永远占着茅坑不拉屎。4.3 预测错时的表项分配关键如果 provider 是 Ti 且预测错了且i M还不是最长表尝试在比 Ti 更长的表 Tj (ij≤M) 里分配一个新项。分配候选挑u0的空/无用项若有多个按策略选低频时允许分配 1~2 项。新项tag写入ctr设成 weak 值如 3-bit 的 0 或 -1 附近符号位本次实际结果u0。如果更长表里没有 u0 的就把那些表的 u 全体减 1不分配老化替出。这一步让 TAGE在错的时候自动把难分支升级到更长历史表而不用人工配置。5. 几个工程要点Tag 宽度随历史增长而加宽长历史表 false hit 代价更大所以 T4/T5 的 tag 比 T1 宽。Base T0 不是摆设短历史/冷启动/长表都没命中时兜底避免随机猜。预测延迟典型 2 拍拍 1 算 index/tag拍 2 读 SRAM MUX 选最长命中。可以流水化。变种L-TAGE加 Loop Predictor、TAGE-SC-L加 Statistical Corrector、ITTAGE间接跳转目标用同一思路都是 CBP 比赛常胜结构。一句话串起来TAGE 把PC不同长度全局历史哈希到多张带 tag 的 SRAM预测时只认 tag 真命中的表、且取最长历史那张作为 provider用 3-bit ctr 给方向、u 位管老化、错预测时把难分支升级到更长历史表——以此在 alias 控制、长相关捕捉、预热速度三者间拿到接近最优的折中。