分支惩罚是什么意思?

What does it mean by a branch penalty?

Branch penalty in pipeline results from non-zero distance between ALU and IF.

这句话是什么意思?

没有(正确的)分支 prediction,fetch 不知道下一步要取什么,直到 ALU 决定条件或间接分支的路径。所以它会停止,直到分支在 ALU 中执行。

或者预测不正确,来自错误路径的fetched/decoded指令是无用的,所以我们称之为分支mispredict惩罚;分支预测在正常情况下将其隐藏。

另一个术语是 "branch latency" - 从获取分支指令到 front-end 获取有用的下一条指令的周期数。

请注意,即使是无条件分支也有分支延迟:指令 一个分支这一事实直到它被解码后才为人所知。这在管道中比执行更早,因此可能的惩罚小于条件或间接分支。


例如first-genMIPS R2000,经典的5级RISC,条件分支在EX阶段只需要半个周期,而. MIPS hides that latency with a branch-delay slot:分支后的指令一直执行,无论它采取与否的分支。 (包括无条件直接分支;ID 阶段可以自行生成目标地址。)后来更深的流水线 MIPS CPU(尤其是超标量 and/or out-of-order)确实需要分支预测,延迟槽不能完全隐藏分支延迟。

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

Branch penalty in pipeline results from non-zero distance between ALU and IF.

有一本很棒但很长的书叫 Computer Architecture Piplined And Parallel Processor Design

详细解释了这个问题。

简答:

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

  1. 取回并执行的错误预测分支 推测然后需要丢弃
  2. 需要获取并执行实际的下一个分支 反应性 无论如何。

长答案: 查找:"Instruction pipelining"、"Branch prediction"、"Loop unrolling"、...