CA-第十四讲 分支目标缓冲

[[计算机体系结构]]
BTB实现
分支目标缓存BTB每个单元应该包括
- 分支指令的地址
- 分支目标的地址
- 分支预测标识
取指阶段,所有指令地址都和BTB中保存的分支指令地址作比较,一旦相同,就认为本指令是分支指令,并且分支成功
它的目标地址就是保存在缓冲区内的分支目标地址
- 取出之后直接送入NPC
BTB的执行过程
采用BTB技术的时候在各种情况下的延迟
BTB的改进
分支预测技术受限于预测精度,以预测失效之后产生的开销
根据不同程序特点以及缓冲区的大小,典型的BTB可以实现80%到95%的预测精度
降低失效开销技术:在一个时钟周期内同时取出不同分支路径的指令
- 会引入其他开销,比如存储器洗头膏的端口加倍
Instruction Fech Unit
分支预测局限性总结
预测的准确性:80% ~ 90%
预测性能依赖于
- 程序类型
- 缓冲区大小
预测失效开销的优化
- 预测不同分支路径指令
- 存储端口数目加倍,交叉存取缓冲
Corei7分支预测浪费的指令
基于硬件的前瞻执行
前瞻执行的基本思想:
对于分支指令的结果进行猜测,并假设这个猜测总是对的,然后按照这个猜测结果继续取、流出和执行后续的指令。
执行指令的结果不是写回到寄存器或者是存储器,而是写入一个称为再定序缓冲器ROB(ReOrder Buffer。得到相应的指令得到”确认“(commit)(也就是确实是应该执行的)之后,才将结果写入寄存器或者存储器
基于硬件的前瞻执行结合了3种思想:
- 采用动态分支预测来选择后续执行的指令
- 在控制相关的结果尚未出来之前,前瞻的执行后续指令
- 对基本块采用动态调度
对Tomasulo算法加以扩充,就可以支持前瞻执行。
- 把Tomasulo算法的写结果和指令完成加以区分写成两个不同的段:
- 写结果,指令确认
写结果段
- 把前瞻执行的结果写到ROB种
- 通过CDB在指令之间传送结果,供需要用到这些结果的指令使用
指令确认段
在分支指令结果出来之后,对相应的指令的前瞻执行给予确认。
- 如果前面所做的猜测是正确的,把ROB中的结果写到寄存器或者存储器。
- 如果发现前面对分支结果的猜测是错误的,那就不予以确认,刷新ROB,并从那条分支指令的另一条路径开始重新执行
ROB中的每一项由以下的4个字段组成:
- 指令类型(instruction)
- 状态(state)
- 目标地址(destination)
- 数据值(value)
保留站RS中增加的域:
- 目标地址(destination):对应的ROB编号
In-Order Issue/Commit
Out-of-order Execution/Writeback
前瞻执行的流程
支持前瞻执行的Tomasulo算法的总结
实际系统的实现非常相似
- Pretium P6 PowerPC,MIPS多种型号等
不足之处:硬件非常复杂
Too many value copy operations
- Register File RS ROB Register
Too many muxes/buses(CDB)
- Values are from everywhere to every
超标量
超标量处理器的可获得的并行度,需要才哟个更有效的编译技术
循环展开成5个副本
使用先前用到的代码作为例子
在超标量流水线上对代码进行调度以获得更多的指令机并行度
每一次迭代需要12个时钟周期。
每个迭代的时候为2.4个时钟周期
- 前面在普通的流水线上,通过循环展和调度,可以达到每个迭代为3.5个时钟周期
- 超标量可以获得更好的性能,代价是硬件复杂性大幅度增加
- 标题: CA-第十四讲 分支目标缓冲
- 作者: Molaters
- 创建于 : 2023-11-24 11:30:49
- 更新于 : 2023-10-18 09:24:21
- 链接: https://molaters.github.io/2023/11/24/计算机体系结构/CA-第十四讲 分支目标缓冲/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论