分支预测

分支预测

4.1 概述

分支预测和Cache一起左右着处理器的性能,一个准确度很高的分支预测是提高处理器性能的关键部件。但由于不同程序的不同特性,适用于某个程序的分支预测器可能在另一个程序上效果很差。

取指阶段要对跳转指令进行预测,避免流水线无用功造成浪费。如果等到跳转结果计算出来再进行取指,就会造成性能浪费。

分支预测之所以能够实现,是由分支指令的特性决定的。

  • 方向,主要分为跳转和不跳转。跳转也分为无条件跳转和有条件跳转。
  • 目标地址
    • 目标地址一般两种形式。第一种是直接跳转,在指令中以立即数的形式给出PC的偏移值。
    • 第二种是间接跳转。指令中给出寄存器号,通过寄存器号访问寄存器获取其中的值作为目标地址。一般寄存器中的值是其他指令的结果,如果要等到执行阶段才能正确获取这个结果,那么这段时间进入到流水线的指令可能都是错误的,加大了分支预测失败的惩罚。

静态分支预测:预测分支指令总是不跳转,处理器顺序取指。在执行阶段获得了实际的跳转方向和目标地址后,再看是否将这段时间进入到流水线的指令进行抛弃。

动态分支预测:根据分支指令在过去一段时间的执行情况来决定预测的结果。

动态分支预测硬件开销大,早期工艺落后,成本高昂。但现在工艺进步,动态分支预测更加适应发展。

理想的分支预测在流水线中越靠前越好,因此最好在获得指令地址进行取指令的同时进行快速分支预测(利用指令地址进行预测,而非指令本身)。

跳转指令情景类型:

for(i=0;i<1000;i++)

4.2 分支指令的方向预测

基于两位饱和计数器的分支预测

根据一条分支指令前两次的执行结果来预测本次的方向,本质是一个4状态的状态机。

strongly taken和weakly taken都预测发生跳转,strongly not taken 和weakly not token都预测不跳转。

核心思想:当一条分支指令连续两次执行的方向都一样时,那么分支指令在第三次执行时也会有同样的方向。如果偶尔发生了一次方向改变,那么预测值不会马上改变。

4.3 分支指令的目标地址预测

直接跳转:偏移值以立即数的形式给出,跳转时将这个数记录下来,下次预测跳转时就可以使用这个值。

间接跳转:因为寄存器的值变化较快,所以不易预测。但程序中间间接跳转类型的分支指令是用来处理子程序调用的CALL和Return指令,这两种指令的目标地址有迹可循,方便预测。

对于直接跳转,如果预测错误,那么可以选择暂停流水线,等待获取立即数再继续执行。

但对于间接跳转,要等寄存器的值更新需要很多拍,此时可以选择继续顺序执行,但如果预测错误需要将当前时间段内进入流水线的指令都进行抹除,会增加功耗。

CALL/Return 指令

一般的间接跳转使用情景都是使用call指令来调用子程序,调用return退出子程序。并且对于程序中的一条指定的call指令来说,它每次调用的子程序都是固定的,即程序入口目标地址也是固定的,因此可以进行预测。比如printf函数,就是存在一片固定的地址空间中。

需要注意的是call指令的地址是固定的,但因为调用call之前的地址是变化的,因此return返回的地址也是变化的,无法预测。但其返回的地址等于最近一次执行的call指令的下一条指令的地址。

4.4 分支预测失败时的恢复

posted @   骑猪上树的少年  阅读(551)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
回到顶部
点击右上角即可分享
微信分享提示

目录导航