【问题标题】:What does it mean by a branch penalty?分支惩罚是什么意思?
【发布时间】:2019-10-18 03:19:04
【问题描述】:

流水线中的分支惩罚是由 ALU 之间的非零距离导致的 和如果。

这句话是什么意思?

【问题讨论】:

  • 令人惊讶的是,Branch predictor - Wikipedia 在解释分支预测(相关模型)和错误预测惩罚方面做得非常好。始终是第一站的最佳竞争者。

标签: assembly cpu-architecture branch-prediction


【解决方案1】:

如果没有(正确的)分支预测,在 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(尤其是超标量和/或无序)确实需要分支预测,延迟槽不能完全隐藏分支延迟。

【讨论】:

    【解决方案2】:

    简答:

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

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

    长答案: 查找:“指令流水线”、“分支预测”、“循环展开”、...

    【讨论】:

    • 您使用“分支”一词来描述(可能的)执行路径上的非分支指令。这令人困惑。而是说“获取了错误预测的路径,需要丢弃”。例如,英特尔对 Skylake 上的 perf-counter 事件 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 以查看。
    【解决方案3】:

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

    流水线中的分支惩罚是由 ALU 之间的非零距离导致的 和如果。

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

    它详细解释了这个问题。

    【讨论】:

    • 您的意思是阶段,而不是周期。 “周期”是时间单位,一个时钟周期。在此期间指令移动到下一个流水线阶段(如果它们没有停止)
    猜你喜欢
    • 2011-07-30
    • 2014-04-30
    • 2021-07-27
    • 1970-01-01
    • 2020-04-22
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多