分支预测缓冲、分支目标缓冲两种解决方法
动态分支预测的两个理由
1.n流出的处理器加速上限为n倍
2.Amdahl定律提示:在较低CPI机器上,控制相关导致的空转对机器性能影响大
前面解决控制相关的静态策略
需要编译器将一条或多条指令移动到流水线产生的分支延迟槽中
关于分支预测策略的两部分工作
1.预测的分支是否成功
2.执行分支目标指令
分支预测的效率
1.预测的准确率
2.分支的开销
预测正确的开销
预测错误的开销
分支预测缓冲(BPB):原理
1.最简单的分支预测策略
2.分支预测缓冲是一个小的存储器阵列
a.每个单元只有一位,记录最近一次分支是否成功的信息
b.预测位为1则预测分支成功,并从目标位置开始取指令
c.单元由分支指令地址的低位索引进行寻址
d.BPB的预测位会被具有相同低位地址的分支设置
BPB也被称为BHP(branch history buffer分支历史缓冲)
3.这种单位预测策略有大约80%左右的准确率
a.当分支不成功时,单位预测会失败两次
b. 2位预测策略能够改善这种情况
2位BPB工作原理
1.在2位预测策略中,一个预测必须错误两次才会改变。
2.对于一个4096条记录的BPB,利用2位预测策略,用SPEC89测试,命中率为82%到99%
准确率最高的测试程序一般包含大量循环
线性代码一般准确率最差
n位BPB
1.1位或2位BPB是n位BPB的特殊情况
2.n位策略使用计数器,表示0~2的n次方的值
3.与2位策略类似,对于n位BPB,每次分支成功,计数器+1,反之则-1
4.如果计数器值大于其最大值的一半,则做成功预测,反之则做失败预测
BPB实现
1.BPB的实现方案
实现一个小而特殊的“cache”,利用指令地址进行索引,在IF流水段访问
或者,为指令cache中每一块增加附加位,与指令一起取出
2.若一个指令在ID段被译码为分支指令,且对应的BPB标志位预测其成功,则
一旦PC已知,立刻从分支目标位置开始取指
或者,继续顺序取指
分支目标缓冲(BTB)
1.另一个动态分支预测方法:分支目标缓冲
Branch Target Buffer,BTB
为了减少或消除流水线的分支开销,我们需要在IF段结束前知道从哪个地址开始取下一条指令
换句话说,我们在IF段就需要知道这条未译码的指令是否为分支指令,并且如果他是分支指令,要尽快知道NPC值应当为多少
BTB实现
1.分支目标缓存BTB每个单元应该包括
分支指令的地址、分支目标的地址、分支预测标识
2.取指阶段,所有指令地址都与BTB中保存的分支指令的地址做比较,一旦相同,就认为本指令是分支指令,并且分支成功
3.它的目标地址就是保存在缓冲区中的分支目标地址
取出后直接送入NPC
BTB Vs BPB
1.分支预测技术受限于预测精度,以及预测失效后产生的开销
2.根据不同程序特点以及缓冲区的大小,典型的BTB可以实现80%到95%的预测精度
3.降低失效开销技术:在一个时钟周期内同时取出不同分支路径的指令
会引入其它开销,比如存储系统的端口加倍
降低失效开销的唯一办法,比如 AS/400 PowerPC处理器(多分支预测)
分支预测局限性
1.预测准确性:80%-90%
2.预测性能依赖于
程序类型
缓冲区大小
3.预测失效开销的优化
预取不同分支路径指令
存储端口数目加倍,交叉存取缓冲
在目标缓冲中缓冲多个路径的指令