如果我具有以下结构:
if( condition() ){
doA();
} else {
doB();
}
那么分支预测如何帮助我?即使正确预测了分支A,我仍然需要评估doA()和condition()-只是不按此顺序进行。还是并行执行分支预测?在这种情况下,它是否与其他线程竞争CPU时间?一般来说,分支预测的最大预期速度是多少?
答案 0 :(得分:2)
由于现代CPU的流水线性质,新的指令在先前的指令完成处理之前就开始进行处理。确切的数量取决于CPU体系结构和指令类型。进行流水线处理的原因是为了使CPU更有效地利用其组件,从而提高指令的吞吐量。例如,被设计来获取下一条指令的电路将闲置至少几个周期,而先前的指令执行其阶段(诸如源寄存器读取,数据缓存访问,算术执行等操作)而无需流水线操作。
但是,它引入了自身的挑战:一个示例是,在管道中存在条件跳转指令的情况下,指令提取部分应如何知道接下来要提取的指令。条件跳转(例如上面的if
所必需的跳转)需要对条件进行评估,以确定下一步要提取哪条指令-但是此评估稍后会在管道中的多个阶段进行。在流水线阶段过渡期间,流水线必须继续运行,并且必须不断加载新指令-否则,您必须等到知道条件的解决方案之后,效率才会降低(流水线停顿:CPU试图避免的条件) 。在不知道下一条指令应该从哪里来的情况下,CPU必须猜测:这称为分支预测。如果猜测正确,则在评估条件并确认目标跳转地址后,管道可以继续保持全倾斜。如果猜错了,则必须清除流水线,以免所有在条件跳转之后开始的指令均从正确的目标跳转地址重新启动:这是昂贵的条件,有效的分支预测算法会尽量减少这种情况。
应用于上面的示例:如果分支预测在大部分时间正确地猜出condition()
的结果,则以下执行(doA()
或doB()
)将继续执行管道刷新:否则,条件语句会导致性能下降。如果condition()
的评估在每次呼叫之间都是随机的,或者遵循分支预测算法难以预测的模式,则会发生这种情况。