分支预测失败时的恢复

参考超标量处理器设计

一、检查分支预测

1.解码阶段

 1)可以获取直接跳转的地址,判断直接跳转是否正确,如果判断错误则分支预测失败,在解码阶段发现分支预测失败惩罚最小。可以马上进行恢复。

2)如果是间接跳转被预测为不跳转,此时无法告诉处理器去指令的正确地址,可以简单暂停流水线,避免抹掉指令造成的功耗浪费。

2.读取物理寄存器阶段

此时若读取到寄存器的值,可以对间接跳转类型的分支指令所预测的目标地址进行检查,若目标地址错误可以使用正确的地址重新取指令,需要将分支指令之后的所有质量从流水线中抹掉,由于部分指令可能进入发射队列,而发射队列中又存在正确的指令,所以此时需要有选择性的清除。

3.执行阶段

不管何种类型的分支指令此阶段均可以获取到正确的跳转地址,如果此阶段才发现先分支预测失败,惩罚是最大的。

方法一:在执行阶段发现分支预测失败,需要抹掉指令的时候,将信息记录在分支指令ROB(重排序缓存)的表项中,暂停流水线的取指令,但是让流水线继续执行,当分支指令变为流水线中最旧的指令时将整个流水线中的指令全部抹掉从正确的地址开始取指令执行。

缺点:需要分支指令在流水线中等待一段时间才能进行处理,若分支指令之前存在D-Cache缺失的load质量,等待时间会很长,这段时间内流水线都无法取新的质量来执行造成惩罚很大。

 方法二:使用Checkpoint方法进行恢复,需要一种机制识别哪些指令处于分支预测失败的错误路径上,通过对每一条分支指令进行编号,所有在这条分支指令后面进入到流水线的指令都会得到这个编号,直至遇到下一条分支指令。

思考:如果第一条分支指令错误的时候,遇到了第二条分支指令,而且这条分支指令的跳转地址是正确的,第二条分支指令后取出,第一条分支指令失败被发现之前的指令怎么办?

比如2分支指令后面进入了错误的跳转地址,后面编号为3的跳转地址是正确的,那取消的时候再怎么办呢?2以后的都需要取消吗?

方法二需要将分支指令的标号之保存在一个FIFO中即编号列表,编号列表的容量等于处理器最多支持的在流水线中的分支指令的个数,如果编号列表满了之后又解码出分支指令,需要暂停解码阶段之前的流水线,直至编号列表中有空余空间。

方法二扩展:具体实现的时候有很多方法可以对分支指令的编号进行分配和回收

举例:使用两个表格,free tag list 和 tag list(上面说的编号列表)

每次解码阶段发现一条分支指令,从空闲列表送出一个编号值并将其写入编号列表,这两个表格本质都是FIFO,流水线分支预测错误后这条分支指令对应的编号值以及它之后的所有编号值对应的指令都被抹掉,编号值被回收进入空闲列表,供后续进入流水线的分支指令使用。

在解码阶段发现预测错误更正预测地址后,这条分支指令也需要分配编号并写到编号列表,因为此时不确定它之前的分支指令(在执行阶段才能得知)是否正确 。

总结:

 1)处理器发射阶段前发现分支预测错误,发射阶段前的所有指令全部抹掉,因为发射阶段前指令仍维持着程序的原始顺,执行阶段发现预测错误的分支指令,发射姐u但之前的所有指令被抹去

2)处理器发射阶段之后的流水段发现分支预测失败,需要使用tag list将分支指令后的指令找出并抹掉,过程较复杂,一个周期可能无法完成。

不需要一个周期广播完毕,从正确的地址获取的指令到达到发射阶段之前,ROB和发射队列及发射队列后的其他流水段中的相关指令被抹掉就可以,若需要更多周期,需要新指令在达到流水线的发射阶段的时候进行等待,直至相关质量都被抹掉且完成状态恢复。

4.何时分配编号值?

解码阶段:此时可以确定哪些质量是分支指令,确保对每一条分支指令都分配一个标号值。

新问题:对于每周期执行多条指令的超标量处理器,若遇到N-way,N个分支指令,需要free tag list在一个周期提供N个编号,需要使用多端口FIFO,但是此种情况并不常见,大部分端口处于空置状态并没有被有效利用,所以约定流水线的解码阶段每周期最多只能处理一条分支指令,若在解码阶段发现N条分支指令,第二条分支指令及之后的所有指令不能再本周起进入解码阶段,被延迟到下一个周期。

5.如何在执行阶段获取到分支指令正确的结果后,知道分支指令在解码阶段之前的预测值?

 在流水线解码阶段将每条分支指令的预测值保存起来,每条分支指令在缓存中的地址随着分支指令在流水线中流动。

优化:只将方向预测为跳转的分支指令保存在缓存中。

但是由于在超标量处理器不能保证对所有的分支指令都进行了分支预测,也不能保证所有的预测结果都是正确的,会有以下几种情况:

1)实际不跳转,PTAB中也无对应内容,预测正确。

2)实际不跳转,PTAB中找到对应内容,预测为跳转实际不跳转,预测错误,将NextPC值作为正确的目标地址。

3)实际跳转,PTAB中没有对应内容,预测错误,需要使用实际计算出来的目标地址。

4)实际跳转,PTAB中有对应内容,需要将实际计算出的目标地址和PTAB中记录的预测值进行比较,相等预测正确,不等使用实际计算出来的目标地址。

思考:取指阶段写PTAB,有没有可能出现将一条非分支指令预测作为发生跳转的情况? 

书中写入伏哦程序中存在自修改的代码,可能会将一条分支指令修改为普通的计算指令,此时需要将分支预测器(branch predictor)中的内容清空,否则会出现将这条指令预测为发生跳转,这种错误会在解码阶段被检查到,占据的PTAB也会被释放掉。

在实际情况中需要在自修改代码执行过后,将分支预测器、I-Cache等部件的内容清空。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值