zoukankan      html  css  js  c++  java
  • 体系结构笔记------动态分支预测

    静态分支预测

    这种方法是直接固定选取分支中的一支,有50%的平均命中率,精度不高适应性几乎没有,但是实现简单。

    动态分支预测

    在程序运行时,根据分支指令过去的表现来预测其将来的行为。
    如果分支行为发生了变化,预测结果也跟着改变;以保证有更好的预测准确度和适应性;
    分支预测的有效性取决于:预测的准确性,预测正确和不正确两种情况下的分支开销;
    决定分支开销的因素:流水线的结构,预测的方法,预测错误时的恢复策略等。
    动态分支预测技术的目的:预测分支是否成功,尽快找到分支目标地址(或指令),避免控制相关造成流水线停顿。
    在预测错误时,要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令

    分支历史表BHT

    最简单的动态分支预测方法
    用BHT来记录分支指令最近一次或几次的执行情况(成功或不成功),并据此进行预测;

    1位预测位

    只记录最近一次的分支运行情况,BHT中只需要1位二进制位(最简单)。

    2位预测位

    两位预测位可以记录分支的运行情况,还可以记录预测的情况。其状态转换图如下:

    这里的两位左边第一位表示分支预测的是否成功,右边一位表示分支运行时是否进行分支跳转。

    运行步骤

    1. 当分支指令到达译码段(ID)时,根据从BHT读出的信息进行分支预测 。若预测正确,就继续处理后续的指令,流水线没有断流。否则,就要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令。
    2. 根据运行状况,修改BHT的状态。

    由于BHT对分支目标地址没提供支持,或者说在BHT下依然要计算分支目标,所以判定分支是否成功所需的时间应该大于确定分支目标地址所需的时间,这时BHT方法才有用。

    分支目标缓冲器BTB

    目标:将分支的开销降为 0
    方法:将分支成功的分支指令的地址和它的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标识。这个缓冲区就是分支目标缓冲器。

    BTB可以是用专门的硬件实现的一张表格,表格中的每一项通常有两个字段:

    1. 执行过的成功分支指令的地址;作为该表的匹配标识 (key)
    2. 预测的分支目标地址

    操作延迟

    前瞻执行

    对分支指令的结果进行猜测,并假设这个猜测总是对的,然后按这个猜测结果继续取、流出和执后续的指令。
    指令执行的结果不是写回到寄存器或存储器,而是放到一个称为ROB(Re-Order Buffer)的缓冲器中;等到相应的指令得到“确认”(commit)(即确实是应该执行的)之后,才将结果写入寄存器或存储器。
    把Tomasulo算法的写结果和指令完成加以区分,分成两个不同的段:
    写结果段:把前瞻执行的结果写到ROB中;通过CDB在指令之间传送结果,供需要用到这些结果的指令使用。
    指令确认段:在分支指令的结果出来后,对相应指令的前瞻执行给予确认,如果前面所做的猜测是对的,把在ROB中的结果写到寄存器或存储器;如果发现前面的猜测是错误的,那就不予以确认,并从正确的分支路径开始重新取指执行;
    允许指令的乱序执行,但必须顺序确认。

    ROB组成

    ROB中的每一项由以下4个字段组成:

    1. 指令类型:指出该指令是分支指令、store指令或寄存器操作指令;
    2. 目标地址:给出指令执行结果应写入的目标寄存器号(如果是load和ALU指令)或存储器单元的地址(如果是store指令);
    3. 数据值字段:用来保存指令前瞻执行的结果,直到指令得到确认;
    4. 就绪字段:指出指令是否已经完成执行并且数据已就绪;

    结合Tomasulo算法的前瞻执行

    支持前瞻执行的浮点结构

    在前瞻执行下,Tomasulo算法中保留站(RS)的换名功能是由ROB来完成的。
    指令的执行步骤:
    流出:从指令队列的头部取一条指令;如果有空闲的保留站(设为r)且有空闲的ROB项(设为b),就流出该指令,并把相应的信息放入保留站r和ROB项b;如果保留站或ROB全满,便停止流出指令,直到它们都有空闲的项。(结构冲突)
    执行:当两个操作数都就绪后,就可以执行该指令的操作;如果有操作数尚未就绪,就等待,并不断地监测CDB。 (RAW冲突)
    写结果:当结果产生后,将该结果连同本指令在流出段所分配到的ROB项的编号放到CDB上,经CDB写到ROB以及所有等待该结果的保留站。释放产生该结果的保留站;
    store指令在写结果阶段完成,其操作为: 如果要写入存储器的数据已经就绪,就把该数据写入分配给该store指令的ROB项;否则,就监测CDB,直到那个数据在CDB上播送出来,这时才将之写入分配给该store指令的ROB项;
    确认:其他指令(除分支指令和store指令之外):当该指令到达ROB队列的头部而且其结果已经就绪时,就把该结果写入该指令的目标寄存器,并从ROB中删除该指令;
    store指令:处理与上面类似,只是它把结果写入存储器;
    分支指令:当预测错误的分支指令到达ROB队列的头部时,清空ROB,并从分支指令的另一个分支重新开始执行(错误的前瞻执行)。当预测正确的分支指令到达ROB队列的头部时,该指令执行完毕;

    优缺点

    主要优点:通过ROB实现了指令的顺序完成;能够实现精确异常;很容易地推广到整数寄存器和整数功能单元上;
    主要缺点:复杂的控制导致所需的硬件太复杂;

  • 相关阅读:
    cmd的操作命令导出导入.dmp文件
    转:String数组初始化
    Oracle计算时间差
    WEB-INF目录与META-INF目录的作用
    【神乎其神】这些EXCEL技巧,太神奇了,赶紧收藏!
    报错: The type ByteInputStream is not accessible due to restriction on required library
    ModelAndView对象作用
    shiro使用
    包装类型的比较,如:Integer,Long,Double
    转一个distinct用法,很有帮助
  • 原文地址:https://www.cnblogs.com/yanzs/p/13788260.html
Copyright © 2011-2022 走看看