分支惩罚是什么意思?

6
流水线中的分支惩罚是由ALU和IF之间的非零距离导致的。这句话是什么意思?

1
令人惊讶的是,分支预测器 - 维基百科在详细解释分支预测(相关模型)和错误预测惩罚方面做得非常出色,始终是首选站点之一。 - David C. Rankin
3个回答

7

如果没有(正确的)分支预测,取指令就不知道下一步要取哪个了,直到ALU决定条件或间接分支的方向。因此,它会停顿,直到在ALU中执行分支。

或者如果预测错误,则从错误路径获取/解码的指令是无用的,因此我们称之为分支预测失误惩罚; 分支预测在正常情况下隐藏了它。

这个术语的另一个名称是“分支延迟”——从取指令分支指令到前端获取有用的下一个指令所需的周期数。

请注意,即使是无条件分支也有分支延迟:直到解码后才知道某个指令是否是分支指令。这比执行早在流水线中,因此可能的惩罚要小于条件或间接分支。


例如,在第一代MIPS R2000中,这是一个经典的5级RISC,条件分支只需要在EX阶段花费半个周期,而IF直到时钟周期的后半部分才需要地址,因此总分支延迟保持在1个周期。 MIPS使用分支延迟槽隐藏了这种延迟:分支后的指令总是执行,无论分支是否被执行。(包括无条件直接分支;ID阶段可以自己产生目标地址。)后来更深度流水线化的MIPS CPU(尤其是超标量和/或乱序执行)确实需要分支预测,延迟槽不能完全隐藏分支延迟。

3
这意味着,处理器在周期之间出现了惩罚。每个处理器都有操作周期,周期中的每个延迟都会导致惩罚,因为它会等待分支在ALU中执行或者:

管道中的分支惩罚来自于ALU和IF之间的非零距离。

有一本很棒但很长的书叫做计算机体系结构——流水线和并行处理器设计。书中详细解释了这个问题。

你的意思是阶段,而不是周期。一个“周期”是时间单位,时钟周期。在此期间,指令移动到下一个流水线阶段(如果它们没有停顿)。 - Peter Cordes

1

简短回答:

如果错误预测了下一个可能的分支,将导致时间浪费(CPU时钟周期),因为

  1. 被错误预测的分支会被推测性地获取和执行,然后需要丢弃
  2. 实际的下一个分支仍需反应性地获取和执行。

长篇回答: 请查阅:“指令流水线”,“分支预测”,“循环展开”等。


你在使用“分支”一词来描述执行路径上的非分支指令,这很容易引起混淆。建议改成“错误预测的路径已经被获取并需要废弃”。例如,在Skylake处理器中,英特尔对int_misc.clear_resteer_cycles的性能计数器事件的描述是“[周期数:发射级正在等待前端从重新定向的路径(遵循分支错误预测或机器清除事件)中获取]*"。(Resteer=将提取阶段指向正确的路径) 请在类似的CPU上的Linux机器上运行perf list来查看。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接