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

Assembly 为什么非寄存器跳转指令需要分支目标缓冲区?,assembly,mips,cpu-architecture,branch-prediction,Assembly,Mips,Cpu Architecture,Branch Prediction,对于MIPS 5级管道,解码级知道分支目标,因为如果分支偏移量在指令中,并且在解码级读取寄存器,则可以轻松提取分支目标 因此,对于一个无序的管道,您显然会遇到像“jr”这样的指令的问题,它可能会使用一个尚未计算的寄存器。对于这样的用途,分支目标缓冲区有明确的用途 但对于像‘beq’这样的指令,我认为有必要使用分支预测器,但对于分支目标,则没有必要,因为您已经知道分支偏移量,当然,您知道当前程序计数器,因此可以轻松找到分支目标 寄存器跳转是使用分支目标缓冲区的唯一指令,还是我遗漏了什么?提取阶段需

对于MIPS 5级管道,解码级知道分支目标,因为如果分支偏移量在指令中,并且在解码级读取寄存器,则可以轻松提取分支目标

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

但对于像‘beq’这样的指令,我认为有必要使用分支预测器,但对于分支目标,则没有必要,因为您已经知道分支偏移量,当然,您知道当前程序计数器,因此可以轻松找到分支目标


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

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

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

请参阅从x86的角度了解更多信息(解码非常昂贵,需要多个阶段,因此这一点更为关键)

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



另请参阅x86基准测试,它是一个巨大的跳转到下一条指令序列。(即相对偏移=0)。当序列足够长,无法放入BTB时,它会减慢速度。

分支目标缓冲区的许多好处来自这样一个事实,即它允许您在获取分支指令之前预测分支的存在和目标,更不用说解码了。为什么这会带来好处?如果您知道一个分支即将到来,那么如何才能提高管道的性能?它仅用于预取目的吗?@Chris在获取BEQ指令后,您要立即获取下一条指令。您不希望等待指令解码并计算其目标。BTB和分支预测的要点通常是避免管道暂停,无论是否有缓存。请参阅其中的说明,获取阶段需要预测,以了解下一步要获取的块。另请参阅x86基准测试,它是一个巨大的跳转到下一条指令序列。(即相对偏移=0)。当序列足够长而无法装入BTB时,其速度会减慢。