分支预测器(Branch Predictor) 汇总介绍

分支预测器(Branch Predictor) 汇总介绍


2024年4月16日发(作者:)

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产

生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完

毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流

水线的指令。

  分支预测技术便是为解决这一问题而出现的。

  分支预测技术包含编译时进行的静态分支预测和硬件在执行时进行的动态分支预测。

静态分支预测:

  最简单的静态分支预测方法就是任选一条分支。1)认为branch一定会token;2)认为branch一定

不会token;这样平均命中率为50%。更精确的办法是根据原先运行的结果进行统计从而尝试预测分支是

否会跳转。

  任何一种分支预测策略的效果都取决于该策略本身的精确度和条件分支的频率。

SPARC与MIPS的最早实现(作为第一代商用RISC体系结构处理器)使用单方向静态分支预测:总是

预测条件跳转不发生,因此总是顺序取下一条指令投机执行。仅当条件跳转指令被求值确实发生了跳转,

则非顺序的代码地址被加载执行。两种CPU都是在解码阶段评价分支指令,取指令占用1个周期。因此分支

目标需要两个周期(即经过了去指令、解码两个周期)才能确定。两种处理器都会在分支指令进入流水线

的执行阶段时,插入一个分支延迟间隙。分支指令完成流水线的执行阶段,就已经能确定是否跳转,这时

就可以决定是后续的顺序出现的指令被继续执行还是跳转到的新指令进入流水。

更复杂的静态预测假定向后分支将会发生,向前的分支不会发生。向后分支,是指跳转到的新地址比

当前地址要低。这有助于配合经常出现的程序的循环控制结构。

一些处理器允许分支预测提示出现在代码中。Intel Pentium 4就是如此。但这一特征在Intel此后的处理

器中不再支持。

静态预测也用于某些处理器分支动态预测没有任何可用信息时的一个最后的办法。Motorola MPC7450

动态分支预测:

动态分支预测是近来的处理器已经尝试采用的的技术。最简单的动态分支预测策略是分支预测缓冲区

(Branch Prediction Buff)或分支历史表(branch history table)。

BHT——Branch History Table,顾名思义,这是记录分支历史信息的表格,用于判定一条分支指令是否

token;这儿记录的是跳转信息,简单点的,可以用1bit位记录,例如1表示跳转,0表示不跳转,而这个表

格的索引是指令PC值;考虑在32位系统中,如果要记录完整32位的branch history,则需要4Gbit的存储

器,这超出了系统提供的硬件支持能力;所以一般就用指令的后12位作为BHT表格的索引,这样用4Kbit的

一个表格,就可以记录branch history了。当然,通过大伙的不懈努力和分析,发现在BHT中用1bit位记录分

支是否跳转还不够准确,用2bit位记录就非常好了,而用3bit或者更多位记录,效果与2bit类似。所以在BHT

中,一般就用2bit位记录分支是否跳转:例如11和10表示这条分支会跳转;01和00表示分支不会跳转。这

个2bit计数器大伙叫做饱和计数器。

BTB——用于记录一条分支指令的跳转地址,由于这儿存储的是指令地址,例如32位地址,因此,这个

表格就不能做到存储BHT那样多的内容了,如果也支持4K条指令,则需要128Kbit的存储空间,这几乎可以

赶上一个L1Cache的容量了,所以BTB一般很小,就32项或者64项。由于这个BTB容量小,并且其用于是

记录分支指令的跳转地址,因此,如果这条指令不跳转,即其下一条指令就是PC+4,则不会在BTB中记录

的。

基于BTB和BHT的分支预测就很简单了:

1)在取指阶段利用PC寻址BTB,如果命中,则说明这是一条跳转指令,利用从BTB中获取到的地址去

取icache;

2)由于BTB中保存的内容不够多,因此BHT的准确率更高,这个时候索引BHT表格,如果发现BHT也

跳转,则说明这条指令预测是跳转的;如果BHT不跳转,则说明不跳转,这个时候就取消BTB中的指令地

址,重新PC+4去取icache;

  

一些典型预测器介绍:

饱和计数

饱和计数其(saturating counter)或者称双模态预测其(bimodal predictor)是一种有4个状态的状态

机:

2位饱和计数器

· 强不选择Strongly not taken

· 弱不选择Weakly not taken

· 弱选择Weakly taken

· 强选择Strongly taken

当一个分支命令被求值,对应的状态机被修改。分支不采纳,则向“强不选择”方向降低状态值;如果分支被


发布者:admin,转转请注明出处:http://www.yc00.com/news/1713199147a2202463.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信