CPU Study - Target Address Prediction for Branch Prediction

参考来源:《超标量处理器设计》—— 姚永斌

分支指令的目标地址可以分为直接跳转(PC-relative)和间接跳转(absolute)。

直接跳转

偏移值(offset)是以立即数形式固定在指令中的,所以目标地址也是固定的。
当再次遇到这个分支指令时,如果方向预测的是跳转, 则目标地址可以直接使用之前记录下的数值。

BTB - Branch Target Buffer

分支指令不发生跳转时:目标地址 = 当前分支指令PC + Size (Fetch Group)
分支指令发生跳转时:目标地址 = 当前分支指令PC +Sign_Extend (Offset)
分支预测器(Branch Predictor)除了需要对分支指令的方向进行预测,还需要对目标进行预测。
RISC指令中计算地址需要的offset是在指令中以立即数形式进行携带,因此offset不会发生变化。
所以只需要一个表格记录每条直接跳转的分支指令对应的目标地址,在二次预测同一条分支指令时进行查表即可。
由于分支预测基于PC进行,不可能对所有PC记录目标地址,所以一般采用Cache形式(BTB)使用多个PC公用同一个空间存储目标地址信息。
直接跳转的BTB

BTB本质就是Cache,使用OC一部分(index)寻址BTB,PC其余部分为tag。
BTB中存放着分支指令的目标地址(Branch Target Address, BTA)。
BTB也会存在存储PC对应多条分支指令的情况,以及BTB内容频繁被替换的现象。
因此采用组相联的BTB,有多条分支指令指向BTB同一个地方时,可以将BTA放到不同way之中。
组相联的BTB

并且分支预测失败并不会造成处理器运行的错误,因为在流水线后续阶段还会对分支预测是否正确进行检查。
如果分支预测不正确,那么这条分支指令之后已经进入流水线的指令会被全部抹除,并从正确的位置开始重新取指令,但也确实存在着部分的性能损耗。

BTB缺失处理

停止执行

BTB miss时,可以暂停流水线的取指令,知道这条分支指令的目标地址被计算出来为止。
对于直接跳转指令,流水线的解码阶段就可以从指令中分离出offset并计算目标地址(PC + Offset)。
解码阶段计算PC+offset

分支指令的目标地址被计算出来之前,暂停取指令会导致流水线中的Bubble出现。
BTB miss导致的Bubble

继续执行

BTB miss时,可以使流水线继续使用顺序的PC值来取指。
当流水线后续阶段目标地址被计算出来后,如果地址与顺序PC值不一样(可能性很高),就将流水线分支指令之后的所有指令抹除掉,使用计算出的PC。
尤其对于间接跳转的分支指令 ,顺序执行命中的效率稍微好一些。但是功耗上会耗费更多(需要抹除大量指令)。

间接跳转

由于目标地址来自于通用寄存器,而通用寄存器数值经常变化。
不过因为程序中大部分间接跳转指令是用于处理子程序中的Call和Return指令,而这两种指令的目标地址都是有规律可循的。
因此大部分设计者会推荐减少使用Call和Return之外的间接跳转分支指令,多使用直接跳转指令,有助于提高分支预测准确度。

Call / Return 指令的分支预测

一般程序中Call用于调用子程序,使流水线从子程序中开始取指令开始执行。
子程序中Return一般是最后一条指令,使流水线从子程序中退出回到主程序的Call指令之后继续执行。
BTB预测CALL指令
不同程序对同一个函数的调用会出现不同PC在BTB中指向同一个address。
但是对于被调用的子函数而言,Return返回则不一样,因此也无法用BTB进行预测。
但是可以确认Return放入目标地址等于最近一次执行的Call指令下一条地址。
三级嵌套的子程序调用

因此可以设计一个存储器,保存最近一次Call指令的下一条指令,这个存储器为后进先出。
工作原理和stack类似,因此称为返回地址堆栈(Return Address Stack, RAS)。
三条CALL指令后的RAS

RAS正确工作需要有两个前提:

判断是否为Call指令
一般只有流水线解码阶段才知道是否为Call指令,但是现代处理器一般需要多个周期才能从I-Cache中取出指令。因此解码时指令后肯定会有多条指令进入流水线。
如果这些指令中存在Return,那么此条Return无法从RAS获取正确目标地址,造成分支预测失败。
因此还需要借助BTB区分是否为Call类型指令,加速保存到RAS。

判断是否为Return指令
当对Return指令进行目标地址预测时,需要能够选择RAS输出作为目标地址的值而不是BTB。
因此需要在分支预测阶段借助BTB区分指令是否为Return,加速分支预测。
BTB区分
当Call指令嵌套过深大于RAS大小时,会出现RAS空间不足的问题。
RAS空间不足

有两种方法处理此类问题:

  • 不修改RAS,最后执行的Call指令返回地址被丢弃,接受下次Return时的分支预测失败。
  • 继续顺序写入RAS,覆盖最旧最外层的内容。
    覆盖写入RAS

RAS也可以增加一个计数器,将写入RAS的Call指令返回地址和上次的返回地址进行比较。
如果相等则表示两次执行的都是同一个Call指令,此时计数器增加,但是RAS栈顶指令不变。
执行到Return分支时,计数器减少,RAS栈顶指针不变。

其他预测方法

间接跳转中除了Call和Return之外的指令,可以根据过去的执行情况进行预测。
例子

也就是可以基于局部历史的分支预测方法,使用BHR进行目标地址的预测(PHT替换为Target Cache)。
BHR预测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值