一、概述
在处理器中,分支预测是除Cache之外另一个决定处理器性能的重要内容。分支预测本质上是对分支指令的结果进行预测,分支指令包含两个要素。
1.方向,指令有跳转指令和非跳转指令两种,跳转指令中又包含无条件跳转和有条件跳转,例如jump指令是无跳转指令,branch指令是有条件跳转。
2.目标地址,如果指令需要跳转,那么就需要知道跳转的目标地址,而跳转目标地址也会存在于指令中。跳转目标地址在指令中的存在形式分为两种,
(1)直接跳转,指令中直接提供了立即数形式表示的相对于PC的偏移值offset,PC加上offset就可得到跳转目标地址。在指令解码阶段就可以提取出偏移值,从而提高分支预测的准确性。但是指令长度直接决定了offset的跳转范围。
(2)间接跳转,目标地址通常存在于通用寄存器中,由于是通用寄存器,所以可以跳转到程序的任意地方,同时目标地址也是其他指令的执行结果。在没有得到最终的目标地址之前,当前执行的预测方向上的指令又可能都是错的,这就增加了分支预测失败时的惩罚。好在绝大多数的分支指令跳转都是由一定规律的,比如Call/Return指令。
对于流水线不深的简单处理器而言,通常采用静态分支预测方法,即认为所有的分支指令不跳转,也就是认为处理器一直是顺序取指,顺序执行,如果发生了分支预测失败的情况,惩罚相对较小,对处理器性能也不会有太大影响。
但是对于超长流水线的高性能处理器而言,静态分支预测已经远远不能满足要求,尤其是分支预测失败时的惩罚让人无法承受。动态分支预测应运而生,所谓动态分支预测指的是根据分支指令的历史跳转记录进行预测。
要进行分支预测,就需要处理器将指令从I-Cache中取出来,判断是否是分支指令,如果是分支指令,将其送入分支预测单元,如下图所示。
因为从取指、解码再到分支预测,往往需要几个周期才能得到预测结果,这极大地影响了性能处理器的性能,尽可能地减少这个过程的处理时间才是当务之急。最理想的结果是当前周期得到取值指令地址,同时进行分支预测,这样在下一个周期就可以根据分支预测结果进行取指。
二、分支指令的方向预测