流水线中的分支惩罚是由ALU和IF之间的非零距离导致的。这句话是什么意思?
如果没有(正确的)分支预测,取指令就不知道下一步要取哪个了,直到ALU决定条件或间接分支的方向。因此,它会停顿,直到在ALU中执行分支。
或者如果预测错误,则从错误路径获取/解码的指令是无用的,因此我们称之为分支预测失误惩罚; 分支预测在正常情况下隐藏了它。
这个术语的另一个名称是“分支延迟”——从取指令分支指令到前端获取有用的下一个指令所需的周期数。
请注意,即使是无条件分支也有分支延迟:直到解码后才知道某个指令是否是分支指令。这比执行早在流水线中,因此可能的惩罚要小于条件或间接分支。
有一本很棒但很长的书叫做计算机体系结构——流水线和并行处理器设计。书中详细解释了这个问题。管道中的分支惩罚来自于ALU和IF之间的非零距离。
简短回答:
如果错误预测了下一个可能的分支,将导致时间浪费(CPU时钟周期),因为
长篇回答: 请查阅:“指令流水线”,“分支预测”,“循环展开”等。
int_misc.clear_resteer_cycles
的性能计数器事件的描述是“[周期数:发射级正在等待前端从重新定向的路径(遵循分支错误预测或机器清除事件)中获取]*"。(Resteer=将提取阶段指向正确的路径) 请在类似的CPU上的Linux机器上运行perf list
来查看。 - Peter Cordes