gpt4 book ai didi

assembly - 为什么非寄存器跳转指令需要分支目标缓冲区?

转载 作者:行者123 更新时间:2023-12-01 01:47:14 24 4
gpt4 key购买 nike

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

因此,对于无序管道,您显然会遇到诸如“jr”之类的指令的问题,这些指令可能使用尚未计算的寄存器。对于这样的用途,分支目标缓冲区有明显的用途。

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

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

最佳答案

获取阶段需要预测以了解接下来要获取的块。指令缓存有一些延迟,但可以流水线化。 DRAM 的延迟甚至更长,但仍可能有多个未完成的请求(取决于内存 Controller 或缓存的外部级别)。所以获取阶段需要在当前从内存/缓存中到达的块之前多个周期的块地址 .

解码直到获取之后才会发生,因此如果您等到解码以检测无条件直接分支的存在,那将是一个额外的停顿周期。

What branch misprediction does the Branch Target Buffer detect?从 x86 的角度了解更多信息(解码很昂贵并且需要多个阶段,所以这更重要)。

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

另见 Slow jmp-instruction对于一个巨大的跳转到下一指令序列的 x86 基准测试。 (即相对偏移 = 0)。当序列足够长而不适合 BTB 时,它会变慢。

关于assembly - 为什么非寄存器跳转指令需要分支目标缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47664947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com