现在的位置: 首页 > 综合 > 正文

《大话处理器》连载——微架构(9) 分支预测——以古为镜,可以知兴替

2018年05月07日 ⁄ 综合 ⁄ 共 1043字 ⁄ 字号 评论关闭

        高级语言中的for、if、else、switch等等,都是通过跳转来实现的。正是由于计算机指令中具有能够改变程序流向的指令,才使得程序结构灵活多样,程序功能丰富多彩。例如下面这个for循环:

for循环在x86上的汇编实现

        在这个for循环例子中,jmp是无条件跳转,直接跳转到地址0x0040d448处,将代码的执行过程组成一个回路,达到循环的目的。jge是条件跳转,在一定条件下跳到地址0x0040d462处,跳出for循环。跳转和分支(branch)等义。

        跳转使程序出现多个执行路径,也即分支,如果我们能提前预测出一条跳转指令是否跳转,以及它的目标地址,我们就明确了程序的执行路径,可以修改程序指针,提前控制流水线从正确的地方开始取指,这样流水线的效率能有极大的提升。

        人们常说,历史总是惊人的相似。伟大君主/千古一帝/文武/大圣/大广/孝皇帝/天可汗/唐太宗/李世民教育我们:“以古为镜,可以知兴替”,也就是说,读历史可以预测未来。同样,我们也可以根据历史信息来对跳转指令进行预测,这就是分支预测。

        采用分支预测,处理器猜测进入哪个分支,并且基于预测的结果来取指、译码。如果猜测正确,就能节省时间,如果猜测错误,大不了从头再来,刷新流水线,在新的地址处取指、译码。因此,分支预测的效果,就体现在预测算法的准确性上。

 (1) 分支预测算法

        无条件跳转指令必然会跳转,而条件跳转指令有时候跳转,有时候不跳转,一种简单的预测方式就是根据该指令上一次是否跳转来预测当前时刻是否跳转。如果该跳转指令上一次发生跳转,就预测这一次也会跳转,如果上一次没有跳转,就预测这一次也不会跳转。这种预测方式称为:1位预测(1-bit prediction)

1位预测

       1-bit预测算法简单,不过在性能上略有不足,原因在于它太容易翻转,2-bit预测则更加稳妥。

 

2位预测(2-bit predictor)

        每个跳转指令的预测状态信息从1 bit增加到2 bit计数器,如果这个跳转执行了,就加1,加到3就不加了,如果这个跳转不执行,就减1,减到0就不减了,当计数器值为0和1时,就预测这个分支不执行,当计数器值为2和3时,就预测这个分支执行。2位的计数器比1位的计数器拥有更好的稳定性。

 

2位预测

        由2位预测又引申出了很多其他的分支预测算法,通常商用处理器大都采用多种策略的组合,来获得更好的预测结果。

抱歉!评论已关闭.