带条件的分支预测(二)

方向预测包括静态预测(见带条件的分支预测(一))和动态预测,下面将对动态预测进行进行介绍。

动态预测是指依赖已经执行过的历史信息和分支指令本身的信息综合进行“方向”预测。

最简单的分支方向动态预测器为一位饱和计数器(1-bit saturating counter),每次分支指令执行之后,便使用此计数器记录上次的方向。其预测机制是下一次分支指令永远采用上一次记录的“方向”作为本次预测的方向。

一位饱和计数器的结构最简单,但是预测精度不如两位饱和计数器。

两位饱和计数器是最常见的分支方向动态预测器,每次分支指令执行之后,其对应的状态机转换如下图所示: 

当目前状态为强不需要跳转或者弱不需要跳转时,预测该指令的方向为不需要跳转;当目前状态为弱需要跳转或者强需要跳转时,预测该指令的方向为需要跳转

每次预测出错之后便会向着相反的方向更改状态机状态,例如:如果当前状态为强需要跳转,会预测为需要跳转,但是实际结果是不需要跳转,则需要将状态机的状态更新为弱需要跳转。

由于总共有4个状态,如从强需要跳转状态需要连续两次预测错误后,才能变到弱不需要跳转,因此两位饱和计数器具有一定的切换缓冲,它在复杂程序流中的预测精度比简单的一位饱和计数器具有更高的精度。

两位饱和计数器对于预测一条分支指令很有效,但是处理器执行的指令流中存在着众多的不同分支指令(对应不同的PC值)。假设只使用一个两位饱和计数器,在任何分支指令执行时均进行更新,那么必然会相互冲击,预测的结果会很不理想。 最理想的情况是为每一条分支指令都分配专有的两位饱和计数器,并对其进行预测,但是指令数目众多(32位架构理论上有4GB的地址空间),不可能提供巨量的两位饱和计数器(硬件资源开销无法接受),所以只能使用有限个两位饱和计数器组成一个表格,然后对于每条分支指令使用某种寻址方式来索引某个表项的两位饱和计数器。由于表项数目有限而指令数目众多,因此很多不同的分支指令都会不可避免地指向同样的表项,这种问题称为别名(aliasing)重合。

目前一般使用各种不同的动态分支预测算法,通俗地讲就是通过采用不同的表格组织方式(控制表格的大小)索引方式(控制别名重合问题),来提供更高的预测精准率。接下来,介绍常见的算法。

最简单的方式是直接将有限个“二位饱和计数器”组织成一维的表格,该表格称为预测器表格(predictor table),并直接使用PC值得一部分进行索引。例如,若使用PC的后10位作为索引,则仅需要维护包含1000个表项的表格。这种方法称为一级预测器所谓“一级”是指其索引仅仅采用指令集本身的PC值。

 该方法虽然简单易行,但是索引进制过于简单,很多不同的分支指令会指向同样的表项(如低10位相同但是高位不相同的PC)。由于没有考虑到分支指令的上下文执行历史,因此分支预测的精度不如两级预测器。

两级预测器也称为基于相关性的分支预测器,对于每条分支指令而言,将有限个两位饱和计数器组织成模式历史表(pattern history table,pht)。使用该分支的跳转历史(branch history)作为PHT的索引。如下图所示,假设用n位记录其历史(1表示需要跳转,0表示不需要跳转),则可以索引2^{n}个表项。

分支历史又可以分为局部历史和全局历史。局部历史是指每条分支指令自己的跳转历史,而全局历史是指所有分支指令的跳转历史。 

局部分支预测器会使用分立的局部历史缓冲区来保存不同分支指令的跳转历史,每个局部历史缓冲区有自己对应的PHT。对于每条分支指令而言,先索引其对应的局部历史缓冲区,然后使用局部历史缓冲区中的历史值索引其对应的PHT。

全局分支预测器则仅使用所有分支指令共享的全局历史缓冲区。全局分支预测器的一个明显弊端是它无法区分每个分支指令的跳转历史,不同的指令会相互冲击,但是它的优势是比较节省资源。因此全局分支预测器只有在PHT容量非常大时,才会体现出其优势。PHT容量越大,全局分支预测器的优势越明显。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狮子座硅农(Leo ICer)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值