【问题标题】:Computer Organization - How does "Predict taken"(always taken) branch prediction work?计算机组织 - “预测采用”(总是采用)分支预测如何工作?
【发布时间】:2020-01-13 11:23:07
【问题描述】:

我可以理解“预测未采取”的工作原理。它只是继续获取​​ PC+4 指令。直到分支解决,如果分支被取走,则刷新之前取到的所有指令。

但我不明白“预测采取”是如何工作的。我认为分支指令需要处于解码阶段(并且需要完成分支目标地址计算),然后处理器才能预测它会被占用,对吧?

那么如何在 MIPS 5-stage pipeline 这样的机器上实现“预测”? (分支目标地址计算和分支是否采取在ID(指令解码)阶段决定)

如果分支可以在ID阶段解决,是否意味着在IF(指令获取)阶段进行了预测?

我很困惑,因为有人说“预测采取”或“预测未采取”被称为“静态分支预测”,编译器会做所有的事情。所以在“预测采取”的情况下,编译器会将分支目标指令插入到分支指令之后的位置。

我的想法对吗?还是他的说法是正确的?

【问题讨论】:

    标签: pipeline cpu-architecture branch-prediction


    【解决方案1】:

    MIPS 具有分支延迟槽,可以隐藏简单 5 阶段管道的分支延迟,对于无条件分支(在 ID 中检测,获取后的阶段),甚至是通过在 EX 的前半部分评估条件分支,及时转发到 IF 的第二半。 (MIPS I R2000 did that)。

    但是,是的,完全避免提取气泡需要在解码之前预测分支的存在,以及它们的目标地址。 (包括无条件直接分支)。真正的预测者会这样做。有关现代 x86 的示例,请参阅 Slow jmp-instruction

    但这与经典的 5 阶段 RISC 相去甚远。

    如果您将这样的动态预测器放入没有分支延迟槽的 5 阶段 RISC,例如一个简单的 RISC-V,您可能会在 fetch 当前正在获取的位置之前实际检查它,因此您可以预测在 下一个 周期中要获取的内容。


    您只能对 条件 分支使用静态始终采用的预测。(并且通常只使用向后位移,因为这些通常是循环分支;预测前向分支到be not-taken 在实践中效果很好,特别是当编译器/程序员相应地布置他们的代码时,if()-type 分支的常见情况是不被采用的)。当您可以检测到有一个分支时,您已经知道它是否是无条件的并且在这种情况下不需要任何预测。

    如果您尚未使用 MIPS I 分支条件早期评估等技巧,则条件分支的分支延迟将是 2 个周期(IF 到 EX)。 静态始终采用的预测会将其缩短到 1 个周期(IF 到 ID)。 不是 0,正如您所说,因为在分支指令本身正在解码时仍在获取未采用的路径。

    即您可以设计 ID 阶段以在看到条件分支时重新引导下一个周期的提取。 (可能在检查向前/向后的位移后,即只是 2 的补码值的高位。)

    因此,您可以针对前向分支的直通和向后循环的分支进行优化,因为它们相对常见。为了做得更好,您将使用按地址或以各种复杂方式索引的动态预测缓存(例如,TAGE 使用最近的分支历史作为索引的一部分,并参见 https://danluu.com/branch-prediction/ 以了解从非常简单到较少的历史进展简单的预测器)。

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2018-09-29
      • 2019-05-10
      • 1970-01-01
      • 2016-10-05
      • 2019-01-23
      • 2014-04-25
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多