分支预测的方案有哪些?
处理器中使用的分支预测方案对其执行具有核心影响。因此,人们在推广有效的方案方面投入了大量精力。
预测可以是固定的或真实的预测。在**固定预测**中,会持续做出相同的猜测,即“跳转”或“不跳转”。这是一种单一结果的猜测。“始终不跳转”方法偏向于“不跳转”路径,因此跳转惩罚 (TP) 通常高于不跳转惩罚 (NTP)。
“不跳转”方案比“跳转”方案更容易实现。许多流水线微处理器采用这种方案,包括某些早期的处理器,如 i486,以及许多出现在 20 世纪 90 年代初的处理器。例如 SuperSparc、Power1 和 Power2,以及 α 21064 和 α 21064A。
预计跳转惩罚将小于不跳转分支的惩罚 (NTP)。
**真实预测**有两种可能的结果,“跳转”或“不跳转”(贯穿执行,顺序路径)。对于真实预测,如上图所示,静态预测和动态预测之间存在差异。如果预测仅基于相关的代码,则称为静态预测。如果预测取决于前面类似分支指令的执行,特别是预测依赖于执行历史,则它们处理的是**动态预测**。
静态预测比动态预测更容易。在静态预测技术中,分支是“始终跳转”或分支是“始终不跳转”。它可以通过检查目标代码的特定属性来进行静态预测。
静态预测包括以下组件,例如基于操作码的预测、基于位移的预测和编译器引导的预测。
基于操作码的预测是通过假设对于某些操作码分支将“跳转”,而对于其他操作码分支将“不跳转”来进行的。例如,在 MC 88110 和 PowerPC 601/603 处理器中使用这种预测技术。
基于位移的预测取决于位移的符号。如果 D < 0,则预测为“跳转”,反之,如果 D≥0,则预测为“不跳转”。这里隐含的假设是具有负位移的条件分支用作循环结束分支。
最后,静态预测也可以来自编译器的提示。这种预测称为编译器引导预测。
相反,**动态预测**基于分支历史。动态预测的基本原理是,在其最后一次出现(或最后 n 次出现)时跳转的分支在其下次出现时也可能跳转。
动态技术比静态方案具有更高的性能潜力。但代价是更复杂的实现,因为处理器必须存储和更新大量分支的最后结果。相比之下,静态方案忽略分支历史,而是即时进行基于代码的预测。