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

Molaters Lv5
[[计算机体系结构]]

BTB实现

分支目标缓存BTB每个单元应该包括

  • 分支指令的地址
  • 分支目标的地址
  • 分支预测标识

取指阶段,所有指令地址都和BTB中保存的分支指令地址作比较,一旦相同,就认为本指令是分支指令,并且分支成功

它的目标地址就是保存在缓冲区内的分支目标地址

  • 取出之后直接送入NPC

image.png

BTB的执行过程

image.png

采用BTB技术的时候在各种情况下的延迟

image.png

BTB的改进

分支预测技术受限于预测精度,以预测失效之后产生的开销

根据不同程序特点以及缓冲区的大小,典型的BTB可以实现80%到95%的预测精度

降低失效开销技术:在一个时钟周期内同时取出不同分支路径的指令

  • 会引入其他开销,比如存储器洗头膏的端口加倍

Instruction Fech Unit

image.png

分支预测局限性总结

预测的准确性:80% ~ 90%

预测性能依赖于

  • 程序类型
  • 缓冲区大小

预测失效开销的优化

  • 预测不同分支路径指令
  • 存储端口数目加倍,交叉存取缓冲

Corei7分支预测浪费的指令

image.png

基于硬件的前瞻执行

前瞻执行的基本思想

对于分支指令的结果进行猜测,并假设这个猜测总是对的,然后按照这个猜测结果继续取、流出和执行后续的指令。

执行指令的结果不是写回到寄存器或者是存储器,而是写入一个称为再定序缓冲器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

前瞻执行的流程

image.png

支持前瞻执行的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 进行许可。
 评论