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

时间:2017-12-06 00:34:40

标签: assembly mips cpu-architecture branch-prediction

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

那么对于无序管道,你显然会遇到类似' jr'这样的指令的问题,这可能会使用尚未计算的寄存器。对于这样的用途,可以明确使用分支目标缓冲区。

但是对于像beq'这样的指令,我看到了分支预测器的必要性,但不是分支目标,因为你已经知道分支偏移量,当然你知道当前的程序计数器所以你很容易想出分支目的地。

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

1 个答案:

答案 0 :(得分:3)

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

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

有关x86的更多信息,请参阅What branch misprediction does the Branch Target Buffer detect?(解码费用昂贵,需要多个阶段,因此这更为重要)。

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

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