【发布时间】:2019-10-18 03:19:04
【问题描述】:
流水线中的分支惩罚是由 ALU 之间的非零距离导致的 和如果。
这句话是什么意思?
【问题讨论】:
-
令人惊讶的是,Branch predictor - Wikipedia 在解释分支预测(相关模型)和错误预测惩罚方面做得非常好。始终是第一站的最佳竞争者。
标签: assembly cpu-architecture branch-prediction
流水线中的分支惩罚是由 ALU 之间的非零距离导致的 和如果。
这句话是什么意思?
【问题讨论】:
标签: assembly cpu-architecture branch-prediction
如果没有(正确的)分支预测,在 ALU 决定条件或间接分支的方向之前,fetch 不知道接下来要获取什么。所以它会停止直到分支在 ALU 中执行。
或者预测不正确,从错误路径获取/解码的指令是没有用的,所以我们称之为分支mispredict惩罚;分支预测在正常情况下隐藏它。
对此的另一个术语是“分支延迟” - 从获取分支指令到前端获取有用的下一条指令的周期数。
请注意,即使是无条件分支也有分支延迟:一条指令是是一个分支这一事实直到它被解码后才知道。这在管道中比执行更早,因此可能的惩罚小于条件或间接分支。
例如,在第一代 MIPS R2000 中,经典的 5 阶段 RISC,条件分支在 EX 阶段只需要半个周期,IF doesn't need the address until the 2nd half of a clock cycle, so the total branch latency is kept down to 1 cycle。 MIPS 用branch-delay slot 隐藏了该延迟:分支之后的指令总是执行,无论它是否采用了分支。 (包括无条件直接分支;ID 阶段可以自己产生目标地址。)后来更深的流水线 MIPS CPU(尤其是超标量和/或无序)确实需要分支预测,延迟槽不能完全隐藏分支延迟。
【讨论】:
简答:
错误预测下一个可能的分支会导致时间浪费(CPU时钟周期),因为
长答案: 查找:“指令流水线”、“分支预测”、“循环展开”、...
【讨论】:
int_misc.clear_resteer_cycles 的描述是“[Cycles the issue-stage is waiting for front-end to fetch from resteered path after branch mispredictor or machine清除事件]"。 (重新转向 = 将 fetch 阶段指向正确的路径。)在具有类似 CPU 的 Linux 机器上运行 perf list 以查看。
这意味着,您在处理器周期之间受到了惩罚。 每个处理器都有操作周期,周期中的每个延迟都会导致惩罚,因为它会等待分支在 ALU 中执行,或者:
流水线中的分支惩罚是由 ALU 之间的非零距离导致的 和如果。
有一本很棒但很长的书叫Computer Architecture Piplined And Parallel Processor Design 。
它详细解释了这个问题。
【讨论】: