Kunminghu MGSC 设计说明
1. 文档范围
本文档说明 Kunminghu v3 中 MGSC 的设计定位和几个关键取舍,重点回答:
- 为什么在已经有
BTBTAGE的情况下仍然保留MGSC - Kunminghu v3 的
MGSC和传统单分支SC相比,工程问题有什么不同 - 当前实现里哪些结构被保留,哪些结构被有意简化
- 当前实现中还有哪些值得注意的工程约束
本文档不展开:
BTBTAGE本体MicroTAGEITTAGE- 顶层 redirect / override 选择逻辑
这些应由单独文档说明。
2. 基本定位
MGSC 可以理解成挂在 BTBTAGE 后面的 statistical corrector。
它不负责独立产生一套完整的 branch 候选,而是只在 BTBTAGE 已经给出方向预测后,再回答一个问题:
- 当前这条 conditional branch,是否值得用一组额外历史模式去推翻
TAGE的结论
所以它的职责不是替代 TAGE,而是:
- 在
TAGE信心不够强时提供二次校正 - 尽量纠正那些
TAGE单独不容易学好的方向模式
目前经验收益大致在 0.3 分/GHz 左右,因此它仍然是 Kunminghu v3 中值得保留的一层增强预测器。
3. SC 原理速记
传统 SC 的基本思路并不复杂:
- 用多组不同类型、不同历史长度的表分别建模 branch 方向
- 每组表给出一个 signed contribution
- 把这些 contribution 累加成一个总和
- 当总和足够大时,用它去覆盖
TAGE的原始预测
如果只保留最粗的一层理解,可以把它看成:
TAGE擅长找“谁来当 provider”SC擅长在 provider 不够稳时,再用更多历史视角做一次投票
Kunminghu v3 的 MGSC 基本沿用了这条思路,没有重新发明一套新的 SC 原理。
4. Kunminghu v3 中真正的新问题
和论文或传统单分支模拟器不同,Kunminghu v3 的 MGSC 不是对“每拍输入一条 branch”工作,而是嵌在块级 BPU 流水里。
这带来两个实际差异。
4.1 它服务的是 fetch block 流水,而不是独立单分支接口
MGSC 的输入并不是裸的 branchPC,而是:
mBTB/BTBTAGE已经筛出的 conditional branch 候选BTBTAGE传下来的方向、置信度等信息- 当前 fetch block 对应的一组历史快照
因此它在预测时的组织方式是:
- 用
startPC + folded history生成各类表的 index - 再用具体
branchPC选中 SRAM line 中对应的 lane - 最后对 block 内每条 conditional branch 分别形成
MgscPrediction
所以它虽然仍然是“按分支给出纠正结果”,但工程上已经是一个 block-level predictor 的后级组件。
4.2 它依赖的历史种类更多
当前 MGSC 不只依赖普通全局历史,还同时使用:
GHRPHR- backward branch history
- IMLI history
- first local history
这些历史都要接入顶层统一的 speculative update 和 squash recover 流程。
因此,MGSC 真正难的地方不在公式本身,而在于:
- 不同历史的折叠状态要和顶层预测流水严格对齐
- 预测、回滚、再更新必须保持一致
5. 当前实现保留了哪些 SC 结构
Kunminghu v3 这版 MGSC 仍然保留了比较典型的多表结构:
BW:backward branch historyL:first local historyI:IMLI historyG:global historyP:path historyBias:与TAGE结果相关的偏置项
这些表共同输出 percsum,再组成 total_sum。
当前最终是否启用 MGSC 覆盖 TAGE,主要取决于两件事:
TAGE给出的置信度等级abs(total_sum)是否超过当前 threshold
所以它本质上不是“总是和 TAGE 对着干”,而是一个带置信度门控的 correction 层。
6. 当前实现里有意做的简化
相对于一份“完全展开”的传统 SC,Kunminghu v3 当前实现做了几处很现实的折中。
6.1 Weight framework 还在,但默认不再作为核心设计点
代码里仍然保留了:
- weight table
- weight-related stats
- weight-scale-diff 这类观测量
但当前 calculateScaledPercsum() 实际上不再对 percsum 做额外缩放。
这不是单纯的“还没做完”,而是一个有意的工程取舍:
- 这部分收益目前看不大
- RTL 侧为了节省面积,暂时不做这套权重缩放机制
因此,当前更准确的理解应是:
MGSC的主收益来自多类历史表本身- weight 相关框架更多是保留了探索接口和统计观测,而不是当前版本的主角
6.2 Threshold 机制以全局门控为主
当前实现同时保留了:
- global threshold
- 可选的 PC-indexed threshold
但默认配置下,真正主导行为的是 global threshold,PC threshold 更多是实验开关。
这也符合当前版本的取向:
- 先把
MGSC作为一层稳定、可控的 correction 机制接入 - 不把过多收益不确定的调参结构堆进默认路径
6.3 Update 策略偏保守
当前并不是每次都训练 MGSC。
它主要在以下场景更新:
SC预测错误- 或者虽然预测正确,但 margin 不够高
这说明当前 MGSC 的训练思路更像:
- 在“明显没学好”或“学得还不够稳”时再介入
而不是把它当成一个完全独立、强侵入性的替代预测器。
7. 为什么说它更像工程化的 MGSC,而不是论文复刻
如果只看原理,MGSC 很像传统 SC;但如果看代码接线,它更像一个为了 Kunminghu v3 顶层 BPU 落地而工程化改写过的版本。
最明显的特征有三个:
- 它依赖
BTBTAGE先给出tage_pred_taken、主预测置信度和 bias 相关信息。 - 它要和顶层 block 预测流水共享 speculative / recover history 机制。
- 它的很多结构选择更强调“能稳定接进现有 BPU”而不是“把 SC 论文里的所有技巧都做满”。
所以这版 MGSC 更适合被理解成:
- Kunminghu v3 中的一层 practical statistical corrector
而不是:
- 对经典
TAGE-SC-L论文结构的逐项翻译
8. 工程提示
MGSC 当前有一个需要简单记住的工程特点:它的收益归因不像 TAGE 那样直观。
原因也比较直接:
- 某些表训练不到
- 前级没有把这条 branch 送到
MGSC TAGE置信度过高,导致MGSC没有介入- 历史恢复路径让某类表没有积累出有效模式
- 某些模式只在少量程序上生效,收益解释不够直接
当前实现已经提供了一些观测接口,例如:
MGSCTRACE- 一组较细的
mgscStats - 单元测试
但这些手段更适合确认“机制是否在工作”,还不太擅长快速回答更细的收益归因问题。因此当前文档只简单提示这一点,不展开太多调参经验。
9. 设计总结
MGSC 当前设计可以概括成四句话:
- 它是挂在
BTBTAGE后面的 statistical corrector,而不是独立的方向预测器。 - 它沿用了传统
SC的多历史表 + threshold gating 思路,但被嵌进了 Kunminghu v3 的 block-level BPU 流水。 - 当前版本保留了
SC的主体结构,但有意弱化了 weight scaling 等收益有限、面积不划算的部分。 - 实现上的关键约束主要来自多历史 speculative/recover 一致性,以及当前仍较有限的收益观测能力。
10. 实现锚点
当前最相关的实现文件有:
src/cpu/pred/btb/btb_mgsc.hhsrc/cpu/pred/btb/btb_mgsc.ccsrc/cpu/pred/btb/test/btb_mgsc.test.ccsrc/cpu/pred/btb/decoupled_bpred.ccsrc/cpu/pred/BranchPredictor.py
11. 参考资料
docs/design-docs/frontend/bpu_top_level.mddocs/design-docs/frontend/btb_tage_design.mddocs/design-docs/frontend/phr_design.mdsrc/cpu/pred/btb/docs/btb_mgsc.md