为什么非寄存器跳转指令需要分支目标缓冲区? [英] Why are Branch Target Buffers needed for non register jump instructions?

查看:16
本文介绍了为什么非寄存器跳转指令需要分支目标缓冲区?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

那么对于乱序流水线,很明显在使用‘jr’这样的指令时会遇到问题,这些指令可能会使用尚未计算的寄存器。对于这样的用途,分支目标缓冲区有明显的用法。

但是对于像‘beq’这样的指令,我认为有必要使用分支预测器,但不需要分支目标,因为您已经知道分支偏移量,当然也知道当前程序计数器,因此您可以很容易地得出分支目标。

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

推荐答案

抓取阶段需要预测才能知道下一步要抓取什么挡路。指令高速缓存有一些延迟,但可以流水线化。DRAM的延迟甚至更长,但仍然可以有多个未完成的请求(取决于内存控制器或高速缓存的外部级别)。因此回迁阶段需要在当前从内存/缓存到达的块之前使用挡路地址

解码直到FETCH之后才会发生,所以如果您等到解码后才检测到是否存在无条件的直接分支,这将是一个额外的停滞周期。

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

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


有关跳转到下一指令的巨大序列的x86基准,另请参阅Slow jmp-instruction。(即相对偏移=0)。当序列足够长,无法放入BTB时,它会变慢。

这篇关于为什么非寄存器跳转指令需要分支目标缓冲区?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆