分支预测技术(Branch Prediction)

分支预测技术(Branch Prediction)

Content #

为了解决这个问题,在1996 年的Pentium Pro 处理器上,引入了分支预测技术(Branch Prediction)。分支预测的核心问题是,转移是发生还是不会发生。换句话说,条件转移指令的条件会不会成立。举个例子来说:

jne branch5

在这条指令还没有执行的时候,处理器就必须提前预测相等的条件在这条指令执行的时候是否成立。这当然是很困难的,几乎不可能。想想看,如果能够提前知道结果,还执行这些指令干嘛。

但是,从统计学的角度来看,有些事情一旦出现,下一次还会出现的概率较大。一个典型的例子就是循环,比如下面的程序片断:

xor si, si
lops:
...
cmp si, 20
jnz lops

当jnz 指令第一次执行时,转移一定会发生。那么,处理器就可以预测,下一次它还会转移到标号lops 处,而不是顺序往下执行。事实上,这个预测通常是很准的。

在处理器内部,有一个小容量的高速缓存器,叫分支目标缓存器(Branch Target Buffer,BTB)。当处理器执行了一条分支语句后,它会在BTB 中记录当前指令的地址、分支目标的地址,以及本次分支预测的结果。下一次,在那条转移指令实际执行前,处理器会查找BTB,看有没有最近的转移记录。如果能找到对应的条目,则推测执行和上一次相同的分支,把该分支的指令送入流水线。

当该指令实际执行时,如果预测是失败的,那么,清空流水线,同时刷新BTB 中的记录。这个代价较大。

From #