【发布时间】: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