控制相关的动态解决方法

分支预测缓冲 Branch-Prediction Buffer

分支预测缓冲是一个小的存储器阵列

  • 每个单元只有1位,记录最近一次分支是否成功的信息
  • 预测位为1则预测分支成功,并从目标位置开始取指令
  • 单元由分支指令地址的低位索引进行寻址
  • BPB的预测位会被具有相同低位地址的分支重置
    BPB也被称为BHP( branch history buffer分支历史缓冲

1位BPB状态图

例题:1位BPB若循环10次,9次预测成功,1次不成功,则分支预测准确性为多高?

解:

这种固定的预测将会在第一次和最后一次循环中出现预测错误。第一次预测错误是源于上次程序的执行,因为上一次程序最后一次分支是不成功的。最后一次预测错误是不可避免的,因为前面的分支总是成功,共9次。因此,尽管分支成功的比例率是90%,但分支预测的准确性为80%(两次不正确,8次正确)。通常这种由循环形成的分支都是进行多次成功,最后一次不成功,因而一位的分支预测将错两次。

为了改进这种预测错误,可以采用两位BPB

工作过程:在2位预测策略中,一个预测必须错误两次才会改变

扩展:n位BPB
n位策略使用计数器,表示0~2n的值

  • 与2位策略类似,对于n位BPB,每次分支成功,计数器+1,反之则-1
  • 如果计数器值大于其最大值的一半,则做成功预测,反之则做失败预测

分支目标缓冲 Branch-Target Buffer

为了减小或消除流水线的分支开销,我们需要在IF段结束前知道从哪个地址开始取下一条指令
换句话说,我们在IF段就需要知道这条未译码的指令是否为分支指令,并且如果它是分支指令,要尽快知道NPC值应当为多少

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

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

工作流程

  • 取指阶段,所有指令地址都与BTB中保存的分支指令的地址做比较,一旦相同,就认为本指令是分支指令,并且分支成功
  • 它的目标地址就是保存在缓冲区中的分支目标地址
  • 取出后直接送入NPC

前瞻技术

前瞻技术结合了三种思想,它允许在处理器还未判断指令是否能够执行之前就提前执行,以克服控制相关

  • 采用动态的分支预测技术选择后续执行语句
  • 在控制相关消除之前的指令前瞻执行
  • 对基本块采用动态调度

关键技术

允许指令乱序执行,但必须顺序确认

加入新的硬件ROB(Reorder Buffer)再定序缓冲,包含三个域

  • 指令类型
  • 目的地址
  • 值域

指令执行过程

  1. 流出
  2. 执行
  3. 写结果
  4. 确认(当一条指令不是预测错误的分支转移指令,到达ROB的出口且结果有效是,即为确认)

多指令流出技术

三种基本结构

  • 超标量

超标量每个时钟周期流出的指令数不定(可多条)
可以编译器静态调度,也可以硬件动态调度

  • 超长指令字
    每个时钟周期流出的指令数是固定的,只能通过编译静态调度

超长指令字采用多个独立的功能单元,多个不同的操作封装在一条长指令字中,每个功能单元在VLIW指令中都有一定的对应区域

  • 超流水

每个功能部件进一步流水化,使得一个功能部件可以在一拍中处理多条指令

Last modification:April 29th, 2020 at 11:41 pm
如果觉得我的文章对你有用,请随意赞赏