【问题标题】:Why are Branch Target Buffers needed for non register jump instructions?为什么非寄存器跳转指令需要分支目标缓冲区?
【发布时间】:2018-05-19 18:47:18
【问题描述】:

对于 MIPS 5 阶段流水线,分支目标在解码阶段是已知的,因为如果分支偏移它在指令中并且您在解码阶段读取寄存器,则可以轻松提取它。

那么对于乱序管道,您显然会遇到像“jr”这样的指令的问题,它可能使用尚未计算的寄存器。对于这样的用途,分支目标缓冲区有明确的用途。

但是对于像“beq”这样的指令,我看到了分支预测器的必要性,但对于分支目标却不是,因为您已经知道分支偏移量,当然您也知道当前程序计数器,因此您可以轻松地想出分支目的地。

寄存器跳转是唯一使用分支目标缓冲区的指令还是我遗漏了什么?

【问题讨论】:

  • Brach Target Buffer 的大部分好处在于它允许您在获取分支指令之前预测分支的存在和目标,更不用说对其进行解码了。
  • 为什么会有好处?如果您知道一个分支即将到来,那如何让您提高管道的性能?它仅用于预取目的吗?
  • @Chris 获取 BEQ 指令后,您要立即获取下一条指令。您不想等到指令被解码并计算出它的目的地。
  • BTB 的要点和一般的分支预测,是为了避免不管是否有缓存都停止流水线。
  • 参见What branch misprediction does the Branch Target Buffer detect?,它解释了获取阶段需要预测才能知道下一个要获取的块。另请参阅Slow jmp-instruction 以获得一个巨大的跳转到下一条指令序列的 x86 基准测试。 (即相对偏移 = 0)。当序列长到不适合 BTB 时,它会变慢。

标签: assembly mips cpu-architecture branch-prediction


【解决方案1】:

获取阶段需要预测才能知道下一个要获取的块。指令缓存有一些延迟,但可以流水线化。 DRAM 具有更多延迟,但仍可能有多个未完成的请求(取决于内存控制器或缓存的外部级别)。所以获取阶段需要在当前从内存/缓存到达的块之前多个周期的块地址

直到 fetch 之后才进行解码,因此如果您等到 decode 才检测到无条件直接分支的存在,这是一个额外的停顿周期。

请参阅What branch misprediction does the Branch Target Buffer detect? 从 x86 角度了解更多信息(解码成本高昂且需要多个阶段,因此这一点更为关键)。

另请注意,高性能 CPU 会并行解码多条指令,并且通常在 fetch 和 decode 之间有一个队列以吸收 fetch 气泡。如果 fetch 阶段预测有一个分支(条件或无条件,无关紧要),它可以将来自分支目标的指令而不是分支之后的指令排队。


另请参阅Slow jmp-instruction 以获得跳转到下一条指令的巨大序列的 x86 基准测试。 (即相对偏移 = 0)。当序列长到不适合 BTB 时,它会变慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多