zoukankan      html  css  js  c++  java
  • 体系结构笔记------动态调度中的记分板算法

    动态调度

    在程序执行的过程中,由硬件来对代码进行调度来减少由于相关导致的停顿。
    对于基本的流水线而言,一旦一条指令受阻,其之后的所有指令都会因此停顿,为了提高流水线的性能我们需要使其可以进行乱序执行。

    流水线划分

    对于原先的五段流水线,即取指周期(IF)、译码与读数周期(ID)、计算与执行周期(EX)、访存与分支跳转(MEM)、写回周期(WB)。我们将译码与读数周期分为两个阶段,也就是流出阶段与读操作书阶段。
    流出阶段:指令译码,检查是否存在结
    构冲突。
    读操作数等待数据冲突消失,然后读操作数。

    相关冲突

    结构冲突

    对于多条指令同时对于同一硬件资源提出请求时产生的冲突为结构冲突,主要是由于有限的硬件资源所导致的。

    数据冲突

    RAW:当前指令需要使用前面指令的结果,所以需要前面指令先写入结果之后当前的指令再读,主要由于真数据相关导致。
    WAR:指令间读操作在前,写操作在后,这是为保证读到的数据为未被修改的数据,所以必须保证先读后写,对指令的执行顺序有严格要求。
    WAW:指令间写操作的顺序,如果两条指令同时有写数据的操作并且其操作的目标对象为同相同的寄存器或者内存单元,则也要保证其运行的先后顺序,保证最终写入的数据是最后执行的指令的。

    这里注意一点就是对于读操作数这个阶段,记分板算法处理的方式是等待冲突消失而不是处理冲突。

    记分板控制

    记分板控制分为四级:流出、读数、执行、写回。(注意不同阶段消耗的时钟周期数不同!)

    流出

    这一阶段进行指令译码,检查是否含有结构冲突,也就是检查当前的指令要使用的硬件的使用状况,之后是检查数据冒险,如果不存在其他运行的指令与当前指令有相同的目的寄存器(WAW)就将指令流出(相应的功能单元更新其内部数据),如果存在结构冲突或者数据冒险就停顿等待冲突消失。(并没有实际解决冲突)

    读数

    如果之前运行的指令没有要写入源操作数,或者当前运行的功能单元没有准备写入包含操作数的寄存器时,则源操作数可用。当操作数可用时进行数据读入,并准备运行。(动态的解决RAW)这样指令可以不按执行顺序的进入执行阶段。

    执行

    执行运算,完成后进入写回阶段。

    写回

    在写回阶段,会先进行WAR冲突的检查,如果存在先读后写就进行停顿等到读结束之后写回。(还是等待的方式处理)

    具体算法

    记分板中记录着程序运行时的状况,主要可以三个表来描述。
    指令的运行过程:也就是上面的四个步骤。

    功能部件的状态:由以下字段描述
    Busy:用于描述功能部件硬件资源的占用情况
    Op:说明运行时所用的是哪一个功能部件
    Fi:目标寄存器
    Fj, Fk:源操作数或寄存器
    Qj, Qk:是否有某个功能单元占用源寄存器Fj或Fk。
    Rj, Rk:用于标识源寄存器是否准备好。

    寄存器的写入状态:如果有某个功能部件最终将结果写入该寄存器就将该寄存器标注上这个功能部件,如果没有就是空白。

    大致流程

    首先是取指令然后到ID段,分为译码与读数两个部分,先检查结构冒险(检查该指令需要使用的运算器是否正在被占用,通过相应功能部件的Busy段可得),有就等待没有就进行操作数的检查也就是数据冒险的检查(检查目的寄存器是否被功能单元占用等待写入,通过寄存器的写入状态FU表对应)。若无数据冲突则指令流出至读取操作数段。这里解决了相关的WAW冲突与结构冲突。流出指令后对于对应的FU表中就应有相应的标识了。
    读取操作数阶段会通过上面的Qj,Qk段与Rj,Rk字段来判断是否有功能单元对源寄存器有写入操作,防止RAW发生,如果有的话就会等待相关的冲突结束,也就是相关的功能部件将结果写入后再读操作数。读取后就交由运算器处理。这样对于运算器而言有些先流出的指令会因为操作数的读取而后执行,实现了指令的乱序执行
    指令的执行就没啥可说的了,不同的指令执行周期不同,等到指令执行结束通知版准备写回。
    在写回段主要检查是否含有(WAR),如果有就等待相应的指令读数结束在进行写回操作,将结果写入寄存器中。

    在图中ADD完成了运行,但是Div中的F6却就绪了,由于F0的RAW并未读入操作数,这时ADD
    的结果也不能写入,必须等到相应的读操作结束才能写入。

    局限

    对于冒险的处理大多以等待来解决,效率低。
    存在结构冒险,就暂停发射指令;
    无法消除 WAR 和 WAW 两种相关,仅通过暂停来处理。
    并行性的使用仅在处理RAW 相关时使用来乱序执行减少停顿周期。

  • 相关阅读:
    python字符串操作
    python学习【一】基础入门
    markdown 编辑器
    jenkins学习笔记-安装
    算法
    python 修改文件内容
    python基础,python第四课
    python基础,python第三课
    python基础,python第二课
    python基础,python第一课
  • 原文地址:https://www.cnblogs.com/yanzs/p/13788262.html
Copyright © 2011-2022 走看看