2026 HPCA: The Last-Level Branch Predictor Revisited
这篇论文的前置工作:2024 MICRO: The Last-Level Branch Predictor
- 重新审视 LLBP 解释它为什么“概念很好但效果还不够好”
- 提出一个改进版 LLBP-X,用“动态上下文深度适配”来同时缓解两类关键问题:模式集冲突和上下文复制冗余
背景问题
- 分支预测仍然是高性能服务器 CPU 的硬瓶颈 (同 2024 MICRO LLBP 论述)
- TAGE-SC-L 预测器的容量需求依旧很大,但难以继续扩展
- 原始 LLBP 存在的问题
- 精度收益明显,但提升有限
- IPC 收益偏小
- 对间接分支、pipeline reset 较敏感
- context hash 是近似,不是精确调用链
- 存储效率低
LLBP 问题剖析: LLBP 的精度损失拆解
limit study: 逐步去掉 LLBP 的设计限制,看每一步能回收多少 MPKI
- 去掉工程性简化(bucketing、删掉部分 history length、SC 不覆盖):MPKI 再降 4.6%
- 增大 tag:再降 1.3%
- 无限 contexts:再降 3.9%
- 无限 pattern/set:再降 9.1%
- 取消 contextualization:再降 4.3%
- 全都放开后,LLBP 几乎追平无限 TAGE;剩余小差距主要来自 D 带来的时间窗口
结论是:影响 MPKI 的主要因素是
- 每个 pattern set 太小;
- contextualization 带来的复制和训练开销。
瓶颈1 :pattern set 冲突
进一步分析每个 context 里有多少 useful patterns:
- 只有 14% 的 context 超过 LLBP 每个 set 的 16-pattern 上限
- 68% 的 context 只有 8 个或更少 useful patterns
说明总容量并不是真的不够,问题在于:pattern 在各个 context 之间分布极不均匀
(2024 MICRO Uneven Cache Block 也是基于类似的观察: ICache Line 里不是所有的 Instruction 都有用到)
更进一步,观察这些热点 context 中 useful patterns 的平均 history length,发现:
pattern 最多的那些 context,正好也是平均 history length 最长的那些 context
结论是:
真正导致 pattern set 冲突的,不是普通 branch,而是 hard-to-predict branches 对长历史模式的大量需求
瓶颈 2:contextualization 带来的 pattern duplication
原始 LLBP 用固定 W=8,把 pattern 按上下文切碎
- 好处: 帮助分散困难分支模式
- 副作用是:短历史模式会被复制到很多 context 里
定量分析 duplication 随 history length 和 W 的变化:
- history 越短,重复越严重
- W 越大,重复越严重
duplication 带来的问题:
- 浪费容量;
- 训练时间变长,因为每个 context 要独立训练
- 适应行为变化更慢,因为更新被分摊到多个 context
核心思想:不同 branch/context 需要不同的上下文深度
基于上面的分析,作者提出最核心的思想:
- 对短历史、容易预测的分支,应该用 浅上下文,减少复制与训练开销
- 对长历史、困难分支,应该用 深上下文,把大量 pattern 分散到更多 context,减少热点 set 冲突
作者做了一个按 history length 分层的实验:
- 对短 history(6–37),W=2 相比基线 W=8,useful predictions 增加 63–213%
- 对长 history(232–3000),W=64 相比 W=8,useful predictions 增加 4.2–95%
结论:单一固定 W 并不是最优策略,应该按 context 动态选择深浅
LLBP-X 的设计
LLBP-X 的基本思路:
- 默认都用 W=2
- 一旦发现某个 context 的 pattern set 冲突较多,而且新分配的模式偏向长 history,就把该 context 切换到 W=64
新增结构:CTT(Context Tracking Table)
LLBP-X 引入的主要新结构是 CTT:
作用是跟踪哪些 shallow context 开始表现出 deep-context 的需求
CTT 的每个表项包含:
- tag(6b)
- avg-hist-len counter(3b)
- depth bit(1b)
- replacement bits(2b)
整体容量约 9KB,可跟踪 6K contexts
context 深度切换机制
切换逻辑分两步:
overflow 触发跟踪
- 当 PB 中某个 pattern set 的高置信度 pattern 数超过阈值时,发出 overflow 信号,让 CTT 开始跟踪该 context
- 论文最终选择的阈值是 7 个高置信度 patterns
平均历史长度决定深度切换: CTT 监控该 context 新分配 pattern 的 history length:
- 若分配的 history 超过阈值 Hth=232,avg-hist-len 计数器加一,否则减一;
- 当它饱和到阈值后,把该 context 切换为 deep(W=64)
将 occupancy + long-history tendency 结合起来,
避免了把“短历史但活跃”的 context 误判成困难 context
LLBP-X 只选了 W=2 和 W=64(二元切换),原因是:
- 更多档位理论上能更细粒度适配
- 但每次切换深度,旧深度下学到的 pattern 基本都要重新学习
- retraining penalty 会抵消更细粒度的收益
双 context ID:CID2 和 CID64
为了支持双深度,RCR 不再只维护一个 context ID,而是同时维护:
- CID2
- CID64
访问时:
- 先用 CID2 去查 CTT
- 若命中,看 depth bit 决定本 context 应该用 CID2 还是 CID64;
- 然后再去查 Context Directory 和发起 prefetch
这个选择过程不在 critical prediction path 上
History Range Selection 机制
原始 LLBP 只保留了 TAGE 21 个 history length 里的 16 个,目的是简化硬件
LLBP-X 利用“深度与 history 自然相关”这个观察,把 history range 也分层管理:
- shallow context(W=2):保留较短 history (论文最终参数是 6–232)
- deep context(W=64):保留较长 history (最终参数是 37–3000)
这样做的意义是:
- shallow set 不再被长 history 模式占坑
- deep set 专门服务困难模式
- 四个 bucket 的利用率更高,冲突更少
本质是让浅上下文和深上下文各自服务不同类型的 history
实验结果
MPKI 精度增益
- LLBP-X 相对 64K TAGE-SC-L,可实现 1.4–27% 的 MPKI reduction,平均 12.1%
- 相对原始 LLBP,带来 0.8–11.5% 的绝对额外精度增益,平均 3.6%
- 相当于比原设计平均再提升 36%
作者还构造了一个理想版本 LLBP-X Opt-W:预先知道每个 context 最优应该选 W=2 还是 W=64 ,因而没有切换后重训练的代价
- 平均 MPKI reduction 是 12.6%
- LLBP-X 真正动态实现的是 12.1%,相当于达到了理想选择的 97%
IPC 性能收益
gem5 全系统仿真结果显示:
- LLBP-X 相对 64K TAGE-SC-L,平均 1.0% speedup,范围 0.08–2.7%
- 原始 LLBP 平均 0.71%
- 理想化 512K TSL 平均 2.4%
作者将 LLBP-X 的性能收益较低归因于:
- branch predictor 只是整个系统的一部分
- 在 server workload 中还受 cache、memory、MLP 等因素共同限制
Prefetch 效率分析
- 84% 的 prefetch 能按时到达 PB,覆盖率不错
- 但只有大约三分之二的 prefetch 真正用于预测
- 40% 属于 over-prefetch
说明:LLBP-X 的 energy/efficiency 还有待提高
还分析了 false-path prefetch:
- 如果把错误路径带来的 prefetch 全去掉
- over-prefetch 会下降 56%
- 但 coverage 会下降 8%
- prediction accuracy 还会额外下降 1.4%
说明 false-path prefetch 虽然“浪费”,但也在帮助系统提前把未来可能需要的上下文带进来
敏感性分析 DSE
1. Hth 阈值
history threshold 从 37 扫到 1444:
- 最优是 Hth=232
- 最差是 Hth=1444
- 大多数 benchmark 对最优点附近并不特别敏感
2. CTT 大小
CTT 从 4K 扫到 8K entries:
- 6K entries 后基本不再继续改善
- 最终选 6K-entry, 6-way,增加约 9KB 存储
3. 容量扩展性
pattern store 从 8K 扩到 128K contexts 时:
- MPKI reduction 从 10.5% 持续提升到 17.6%,说明 LLBP-X 具有扩展性
- 配一个 4 倍更小的 16K TAGE-SC-L,LLBP-X 仍可带来 2.6% MPKI reduction
预测一种 BPU 形态:小 TAGE + LLBP-X
面积和复杂度代价
LLBP-X 的附加开销:
- 主要来自 CTT:9KB
- RCR 从 8 扩到 64 unconditional branches,增加 224B
- CD replacement bits 从 2 增到 3,增加 142B
- 总开销约 9.36KB,相对原始 LLBP 只增加 1.8% 容量
局限 Futurn Work
- 离理想 512K TSL 仍有明显差距
- prefetch 的能耗效率不够理想
- over-prefetch 意味着主存储访问和 PB 填充仍有明显冗余
- 深度切换存在 retraining penalty
- 启发式控制: overflow + avg-history-length
- 不是最优策略,只是很好的近似 (97% of Opt-W)