在近期举办的第六届分支预测锦标赛(Championship Branch Prediction, CBP 2025)上,香山开源处理器团队满洋、勾凌睿同学提交的分支预测器设计荣获第三名的佳绩。本次比赛是该项顶级赛事时隔九年的再次举办,竞争尤为激烈。
分支预测锦标赛旨在解决现代处理器的预测瓶颈,推动算法创新,其历史成果如 TAGE、神经网络预测器等已被广泛应用于现代高性能处理器中。本届比赛采用了 ARM 提供的真实应用 trace 作为负载,并新增了寄存器值、load 指令地址等多源信息,对预测器设计提出了更高要求。
团队参赛作品题为《LVCP: A Load Value Correlated Predictor for TAGE-SC-L》。其核心创新在于,通过捕捉分支指令与先前 load 指令所载入数据值之间的相关性,来提升对“难预测分支”的预测准确率。这类分支通常具有数据依赖性,基于传统分支历史的预测器难以处理。
最终,在总计 192KB 的存储预算限制下,该预测器在官方测试集上取得了 MPKI(每千条指令误预测数)3.373 的好成绩,仅次于第一名(3.197)与第二名(3.363)。与同规格的 2016 年冠军预测器 TAGE-SC-L 相比,误预测率降低了 2.07%。
LVCP 在结构上包含三个关键组件,分别是:难预测分支表(Hard-to-Predict Branch Table)、Load 跟踪结构(Load Tracking Structure)和相关性表(Correlation Table)。难预测分支表用于识别哪些分支属于“难预测”类别。该表通过一个饱和计数器记录分支被 TAGE-SC-L 错误预测的次数,一旦计数器饱和,即认为该分支可能适合使用 LVCP 进行预测,并开始训练相关性表。
Load 跟踪结构由三部分组成:Load 标记表在译码阶段记录指令缓存行中 load 指令的位置;Load 跟踪队列跟踪最近由预测器预测的控制流中的 load 指令及已完成的 load 指令的值,供后续分支预测使用;远距离 Load 缓冲用于捕获超出队列长度的长距离 load-branch 依赖关系。
相关性表是 LVCP 的主要存储结构,以组相联的方式组织,通过分支 PC、load PC 和 load 值的组合哈希进行索引和匹配。每个表项包含方向、置信度计数器和“方向变化标记”,用于无效化过时或错误的相关性表项。
在预测时,LVCP 会并行查询 Load 跟踪队列和远距离 Load 缓冲,寻找与当前分支可能相关的 load 指令。对于每一个候选 load,使用分支 PC、load PC 和 load 值组合生成哈希,用于查询相关性表。LVCP 会优先选择置信度饱和的最近 load 所关联的预测结果。如果找到符合条件的预测,就会覆盖 TAGE-SC-L 的预测结果;否则仍沿用主预测器的输出。
预测时还会查询 Load 标记表,并将控制流中被标记的 load 指令在 load 跟踪队列中分配一项。这是为了接近精确地跟踪 load 和后续分支之间的距离。
在训练阶段,只有当分支被标记为难预测分支且整体预测错误时,才会考虑在相关性表中分配新条目。系统会寻找未被标记为 useful 的表项进行分配,必要时会通过概率性衰减机制腾出空间。每个表项都配有 useful 计数器,当 LVCP 纠正了主预测器的错误时,相应表项的 useful 计数器会增加。而如果某个表项提供的预测方向与真实方向不一致,则会被标记为“方向变化”,此后该表项将不再参与预测,避免持续的错误预测。
除了 LVCP 创新外,提交参加比赛的预测器还融合了多项近年来提出的预测技术优化。SC 中引入了每 PC 区间的历史(per-set history),改进的 IMLI(最内层循环迭代计数器)特征,包括将 IMLI 拆分为分支 IMLI 和跳转目标 IMLI,更好地捕捉非固定位置退出的循环的特征。同时,出于可实现性考虑,SC 中没有使用大的局部历史表。
在比赛限制的总计 192 KB 的存储预算下,LVC-TAGE-SC-L 在 105 条训练 trace 上实现了 3.372 的 MPKI,相比同存储大小的 2016 年分支预测锦标赛冠军 TAGE-SC-L 预测器降低了 2.07% 的误预测率,尤其在 fp、int 和 infra 类负载中效果明显。
LVCP 的提出,不仅为分支预测提供了新的上下文感知维度,也为未来在真实处理器中利用 load 值等多源信息进行动态预测提供了可行方向。此次成绩是团队在处理器微架构设计领域持续探索的一个缩影。
我们期待这些探索能为“香山”开源高性能处理器核生态的发展带来新的思路,也向所有参赛者和组织者致以敬意。未来,团队将继续深耕于此,为推动关键技术发展贡献一份力量。