use*_*312 4 assembly cpu-architecture branch-prediction
流水线中的分支惩罚是由 ALU 和 IF 之间的非零距离造成的。
这个声明是什么意思?
如果没有(正确的)分支预测,在 ALU 决定条件分支或间接分支走哪条路之前,fetch 不知道接下来要获取什么。所以它会停止,直到分支在 ALU 中执行。
或者预测不正确,从错误路径获取/解码的指令是无用的,所以我们称之为分支错误预测惩罚;分支预测在正常情况下隐藏它。
另一个术语是“分支延迟”——从获取分支指令到前端获取有用的下一条指令的周期数。
请注意,即使是无条件分支也有分支延迟:指令是分支的事实直到被解码后才知道。这在管道中比执行更早,因此可能的惩罚小于条件分支或间接分支。
例如,在第一代 MIPS R2000 中,经典的 5-stage RISC,条件分支在 EX 阶段只需要半个周期,而IF 直到第二个半时钟周期才需要地址,所以总分支延迟保持在 1 个周期。MIPS 使用分支延迟槽隐藏了延迟:分支后的指令总是执行,无论它是否采用了分支。(包括无条件直接分支;ID 阶段可以自行生成目标地址。)后来更深入流水线的 MIPS CPU(尤其是超标量和/或乱序)确实需要分支预测,延迟槽不能完全隐藏分支延迟。