分支预测
流水 CPU 遇到尚未求出条件的分支时,可以先预测下一地址,继续取指;猜错后丢弃错误路径的工作,恢复正确路径。每个分支位置的两位计数器便能利用重复结果,但效果取决于分支历史。
好比厨师按熟客的习惯提前备餐:猜对能减少等待,猜错则已做的工作作废。CPU 的代价取决于判定前推进了多少工作以及恢复机制,本课用固定两周期展示。
分支预测如何工作
本模型五级为 IF、ID、EX、MEM、WB,每周期取一条指令,分支在 EX 判定。分支取指后的两个周期里,前端已取了两条后续指令,必须预先选择顺序地址或目标地址。
也可以等判定后再取指,但本模型会对每次分支付出两个空周期。预测让猜对时继续工作,猜错时才恢复。许多流水处理器采用预测,具体前端设计各异。
预测表可由分支地址索引。本课只显示一个分支对应的一项,并让三个策略处理同一历史:
- 总预测跳转:不保存历史。对执行 n 次的循环底部分支,前 n−1 次跳转、末次退出,这种策略只错退出一次。
- 一位历史:保存上次结果并照此预测。能快速跟随变化,也会被一次例外翻转。
- 两位计数器:保存 0–3 的饱和状态。0、1 预测不跳,2、3 预测跳。实际跳转则加 1,不跳则减 1,在端点保持,不回绕。强状态需要两次相反结果才跨过预测边界;弱状态一次就能改变预测。
两位状态的迟滞让一次循环退出不必抹掉之前的跳转趋势。
逐步演示
默认观察内层四轮循环末尾的 blt,外层共进入三次,结果为 T,T,T,N 重复三遍。两位状态冷启动为 00,强不跳转。每轮有四条指令,每次误预测增加两周期。
- 第 1 次:状态 00 预测 N,实际
j=1<4为 T。冲刷后面两条,损失两周期,状态 00→01,仍预测 N。 - 第 2 次:再猜 N、实际 T,再损失两周期,01→10,跨到跳转侧。冷启动共错两次。
- 第 3 次:状态 10 猜 T,实际 T,正确,状态到 11。
- 第 4 次:j=4,循环退出为 N,预测 T 失败,损失两周期。11→10,仍预测 T。
- 第 5 次:外层重新进入,实际 T,状态 10 的预测正确。一位策略会在上次退出后改成 N,此时再错;两位策略保留了跳转倾向。
- 第 6、7 次:都为 T 且猜对,状态 11 饱和,不继续增长。
- 第 8–12 次:只在第 8、12 次退出时猜错,其他正确。
最终十二次分支错五次:三次退出、两次冷启动。基准 48 条指令加十周期罚时,共 58 周期,罚时约占 17%。这里的周期模型省略流水填充与排空开销。
同一历史下,一位策略错六次:每轮退出,加第一次冷启动和后两次重入;总预测跳转只错三次退出,反而最好。对规律纯循环,静态策略已抓住主导结果;动态策略在其他模式中才体现优势,例如后面的排序数据总跳转错六次,两位只错两次。
误预测代价
本课分支取指到 EX 判定之间有两个周期,因此固定罚时 2。更深、更宽或恢复过程不同的真实前端可付出更高代价;不能把罚时直接等同于整条流水线的深度,也不能简单等同于冲刷指令数。
画布采用 cycles = instructions + penalty × mispredictions。若假设每次罚时 12,五次误预测便是 60 额外周期,而非 10。对 B 次分支,准确率下降五个百分点会增加 0.05×B×penalty 周期;罚时从 2 升到 20,额外成本放大十倍,占总运行的比例还取决于分支频率。
排序与打乱
两个数据预设都对同样十二个值执行 v >= 128。代码、指令数、比较次数与跳转总数一致,仅顺序不同。
排序后是六次 N 接六次 T,只有一次趋势变化。两位冷启动 00 在前六次都正确,然后在最初两次 T 出错,才转到跳转侧;一位策略只错第一个 T。这里快速适应胜过迟滞。
打乱的指定序列中,两位策略错七次,比总预测跳转的六次还多。十二轮各四条指令,排序为 48+2×2=52 周期,打乱为 48+2×7=62 周期;打乱比排序多约 19%。这说明分支结果顺序可改变成本,不代表排序总能让程序更快。若只为一次循环排序,排序成本可能超过节省;编译器也可能已生成无分支代码。
边界情况
- 冷状态来自初始化,不来自证据。这里 00 确定预测 N,短运行受它影响较大,长运行则分摊启动成本。
- 默认四轮循环每次退出都被三种策略猜错,进入 k 次就产生 k 次退出错误。此结论针对该历史与状态,并非所有循环都必错;真实循环预测器可学习次数,全局历史也能提供额外信息。
- 状态 11 再遇 T 保持 11。它是饱和位置,不是累计次数。
- T、N 完全交替且一位初始猜 N 时,十二次全错。此预设两位从 00 起,在 00、01 间往返,一直猜 N,正确一半。
- 实际表会别名冲突,不同分支地址可能共享一项并互相训练。本课只有一项,不模拟别名。
常见错误
- 每次猜错只算一周期。此模型是两周期,实际依赖判定与恢复延迟、前端宽度等。
- 把误预测当程序算错。模型会冲刷错误路径,按正确路径恢复,不改变最终语义;成本体现在多做工作。
- 以为更复杂策略必胜。默认总跳转三错,一位六错,两位五错,应看输入历史。
- 只优化难预测分支的本体。随机数据可能让局部历史无用,可考虑数据组织、条件移动或用比较结果做算术,也可接受代价。先测量,避免预处理比节省更贵。
- 把 11 当 75% 概率。它表示强跳转,需要连续两次 N 才改成不跳转预测,不是概率估计。
模型范围
只展示一个分支与一项预测状态。真实核心可有数千表项,并结合分支目标缓存、多种预测器和全局历史,利用不同分支之间的相关性。
画布假设五级、每周期完成一条、无缓存未命中和数据相关、EX 判定,按简化稳态公式计周期。真实处理器可乱序、宽发射并有大量在途指令。预测、取指、验证、丢弃的机制仍适用,具体数字属于本课机器。