分支预测是如何加速的



如果我有以下结构:

if( condition() ){
doA();
} else {
doB(); 
}

那么分支预测对我有什么帮助呢?即使分支A被正确预测,那么我仍然需要评估doA((和condition((——只是不按这个顺序。或者分支预测是并行执行的?在这种情况下,它是否与其他线程竞争CPU时间?一般来说,分支预测的最大预期速度是多少?

由于现代CPU的流水线性质,在以前的指令完成处理之前,就开始处理新的指令。确切的数字取决于CPU架构和指令类型。流水线的原因是为了使CPU更有效地利用其组件,从而提高指令的吞吐量。例如,设计用于获取下一条指令的电路将空闲至少几个周期,而前一条指令在没有流水线的情况下执行其各个阶段(如源寄存器读取、数据缓存访问、算术执行等(。

不过,它引入了自己的挑战:一个例子是,在管道中存在条件跳转指令的情况下,指令获取部分应该如何知道下一个要获取的指令。条件跳转(例如上面的if所必需的跳转(需要对条件进行求值,以确定下一步要获取哪个指令——然而,这种求值会在管道的几个阶段之后进行。在通过管道阶段的转换过程中,管道必须继续运行,并且必须继续加载新指令——否则,您将失去效率,不得不等待条件的解决方案(管道停滞:CPU试图避免的条件(。在不确定下一个指令应该来自哪里的情况下,CPU不得不猜测:这就是分支预测。如果猜测正确,在评估条件并确认目标跳转地址后,管道可以保持全速运行。如果猜测错误,则必须清除管道中在条件跳转后启动的所有指令,并从正确的目标跳转地址重新启动:高效的分支预测算法试图最小化这一代价高昂的条件。

应用于上面的示例:如果分支预测在很大一部分时间内正确地猜测了condition()的结果,则以下执行(doA()doB()(将在没有管道刷新的情况下继续:否则,条件语句会带来性能打击。如果condition()的评估从一个调用到另一个调用是随机的,或者遵循分支预测算法发现难以预测的模式,则可能发生这种情况。

相关内容

  • 没有找到相关文章

最新更新