“一张gshare方向表,$2^m$个二位饱和计数器;推测历史H与已提交历史Hc,均为h位,$0\le h\le m\le12$”
形式陈述
双态预测理路双态分支方向预测Bimodal branch prediction · Two-bit branch predictor · 二位饱和计数分支预测以分支地址索引二位饱和计数器,分清先预测后训练、方向滞后与无标记表中的相互干扰。按PC选一个二位计数器;同一PC总去同一槽,无法区分“这一次前面发生了什么”。gshare保留一段全局方向历史,并把它与PC一起用于选择计数器。计数器如何输出N/T、如何饱和训练不变,变化的是上下文到槽的映射。
延用32位四字节对齐PC、串行正确路径反馈协议和T=1、N=0。表有
两项都小于
predict(pc)必须保存当时的
历史不变量可直接归纳:在第
直觉
想象同一条条件判断在两种上下文中表现相反。把所有情况混在一个计数器里,证据会互相抵消;如果最近几次分支能说明现在是哪一种情况,就可以给不同情境各留一份偏好。
这里保存的是方向序列,不是所有先前PC,也不是程序变量。两个执行前缀可能有相同方向后缀而经过完全不同的代码;相同后缀也可能不足以决定下一结果。历史只是一个有限特征,不带“世界从此可预测”的保证。
异或也不是无冲突编码。固定某个
两个PC/历史组合就访问同一槽。左边与右边的差异可能恰好抵消。把两份信息混合进
例子与边界
一个历史位足以学会交替
只运行PC=0x100,真实方向为 (TN)^8。取
| 次数 | 旧H | 查询槽 | 旧计数 | 建议 | 实际 | 新计数 | 新H |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | N | T | 2 | 1 |
| 2 | 1 | 1 | 1 | N | N | 0 | 0 |
| 3 | 0 | 0 | 2 | T | T | 3 | 1 |
| 4 | 1 | 1 | 0 | N | N | 0 | 0 |
此后两个槽分别稳定支持T和N,16次只错第1次。同初值的bimodal把两种上下文合在一起,16次全错。这个例子说明了为何历史可能有用;它没有证明gshare在所有序列上优于bimodal。
若把
相关分支与过长历史的反例
现在每轮依次执行A=0x100、B=0x108,B的方向复制本轮A;A按 N,T,N,T,… 交替。16轮共32次,实际方向序列为 (NNTT)^8。bimodal的四槽能分开两个PC,却没有区分轮次,总共错16次。
取
保留四槽、把历史改为
这不是“历史太长必然不好”的定理,而是一个可执行的非单调见证。把表改为八槽时,
先移动历史再寻槽,会教错对象
回到一位历史交替例子。第一次查询旧
这个错误变体在16次交替上全部猜错,合法实现只错1次。保留ticket不是装饰性的日志,而是在接口中保存“这次建议来自哪里”。当前串行协议下保存索引已足够;若允许多个未决分支,history检查点、更新顺序和错误路径撤销都要另定,不能声称一个保存整数的ticket已经完成推测恢复。
推论与应用
在
计数表加历史共
多在途预测状态恢复理路推测分支预测状态的恢复Speculative predictor recovery · Speculative branch-history recovery · 多在途预测状态恢复对多条在途分支保存查询身份和完整预测状态,允许乱序解析、取消错误路径后缀,并以按序提交训练证明历史与返回栈的可重放不变量。另行扩展本页的逐次反馈合同:查询立即把预测位移入推测历史,任意存活记录可先解析,错误时恢复前检查点并取消年轻后缀。方向表仍等按序提交才训练,使用保存的查询索引和提交时当前计数器;已提交历史副本用于整体flush。
如果历史对某些PC有帮助、对另一些PC造成干扰,可以同时保留地址偏好与历史偏好,再用锦标赛式选择器理路锦标赛式分支预测器选择Tournament branch predictor · Combining branch predictors · 分支预测选择器同时收集地址与历史预测器的事前建议,只在分歧反馈中训练选择器,明确双边训练、适应滞后和无普遍胜出保证。根据过去的相对正确情况挑一方。多保留两张表的费用也必须计入,不能把组合器的全部存储当成单个分量的预算。
终点任务要求重现2错与23错的同容量差别,并找出至少一对相撞的PC/旧history。若只输出最终准确率而没有保存查询索引,就很难区分“规律本身难学”和“训练错了槽”。它还要求比较先热身再计分与冷启动,且不把这份trace实验冒充带BTB和flush的完整CPU模拟。
参考资料
- Scott McFarling,Combining Branch Predictors,DEC WRL TN-36,1993,§§5、7,尤其“Global History with Index Sharing”:全局历史与PC异或,短历史置高位及容量干扰。
- Tse-Yu Yeh and Yale N. Patt,Two-Level Adaptive Training Branch Prediction,MICRO 1991,§2.1:先由旧历史查询模式表,反馈更新所查条目并移动历史。原文该节的per-address历史与本页单一global寄存器不同,引用的是更新接口,而非把两种组织混为一谈。