体系结构12_指令的动态调度

 编译器本质上通过每个循环迭代中寄存器重命名来展开循环

硬件也可以通过寄存器重命名和乱序执行来获得同样的效果

动态调度

  - 记分牌

  - Tomasulo's 算法

冒险的检测和调度

1.如果存在数据相关,硬件检测机制会做如下的事情知道相关消除动态调度

   -暂停指令

   -停止取指令和发射指令

2.静态调度(开始于60s,流行于80s)消除动态调度

     软件来负责调度指令减少空转

3.动态调度

     硬件对指令的执行重新排序来减少空转

     目的:在程序执行的时候,解决WAW、WAR和RAW带来的冒险

     优点:a.处理在编译的时候未知的相关,简化编译器  b.在不同的流水线上都能有效的运行

     缺点:很大地增加了硬件的复杂性

     两个动态调度技术:a.记分牌  b.Tomasulo算法

记分牌

1.记分牌1964被Cray用于CDC 6600

2.记分牌允许指令乱序执行,前提:

    充足的资源,无数据相关

    记分牌动态解决了先写后读相关

    指令可以乱序执行

3.基本原理

   a.每条指令均经过记分牌,记录各指令间数据相关的信息

   b.如果记分牌判断出一条指令不能立即执行,它就检测硬件的变化从而决定何时能够执行。

记分牌处理

1.流水线ID段被分为两级

     a.流出-解析指令,检查结构相关

     b.读操作数-直到不存在数据相关时,才读取操作数

2.如果存在WAR或者WAW相关,记分牌会暂停这条指令的执行,直到相关消除后才继续执行

3.记分牌的基本结构

记分牌执行过程

1.流出(Issue)

     a.看本指令所需的功能部件有空闲

     b.正在执行指令使用的目的寄存器是否与本指令不同

        -看是否WAW相关

 如果功能部件无空闲,或者与正在执行的指令使用的目的寄存器相同,则本指令不能被流出。

2.读操作数(Read operands)

    a.前面已流出的还在运行的指令不对本指令的源操作数寄存器进行写操作

    b.一个正在工作的功能部件已经完成了对这个寄存器的写操作

    c.动态解决RAW相关

前面两部完成了原来ID段的功能

3.执行(Execution)

   a.开始于取到操作数后

   b.当结果产生后,修改记分牌

   c.FP流水部件会占用多个周期

4.写结果(Write result):检查WAR相关

出现以下情况时,不允许指令写结果:

  -前面的某条指令还没有读取操作数(先读后写相关)

  -其中某个源操作数寄存器与本指令的目的寄存器相同

记分牌结构

1.实质上是功能部件状态表

2.用9个域来记录每个功能部件的状态

   Busy:指示功能部件是否工作

   Op: 功能部件当前执行的操作

   Fi:目的寄存器编号

   Fj,Fk: 源寄存器编号

   Qj,Qk:向Rj,Rk中写结果的功能部件

   Rj,Rk:标示Fj,Fk是否就绪,是否已经被使用

程序实例

    

第一拍:第一条指令:流出(申请使用整数部件,检查F6和R2是否就绪(此时就绪))

第二拍:第一条指令:取到R2和36的值

              第二条指令:判断是否能够流出(LD指令需要使用整数部件,查记分牌发现处于忙碌状态,正被第一条指令征用。此时                                    第二条指令处于结构阻塞,不能流出)

  

第三拍:第一条指令:完成地址的计算(R2的内容和36相加),然后将R2释放。

               此时第二条指令不能流出,那么第三条指令可以流出吗?

                -根据我们的约定,前面的指令不流出,后面的指令不能流出,我们做机器的时候就是这样设计的。

第四拍:第一条指令:拿到结果写回到F6中,同时要把整数部件释放掉

第五拍:第二条指令:流出

    

第六拍:第二条指令:读操作数

               第三条指令:流出

第七拍:第二条指令:计算地址(R3+45),然后将R3释放

               第三条指令:因为需要从从第二条指令下用的整数部件计算得到,所以不能向前推进

               第四条指令:流出,(减法指令需要用到加法部件(空闲(就绪)),而且F8空闲)

    

第八拍:前半拍:第二条指令的结果写到F2中去,此时并不能直接供给下面的指令使用

              后半拍:下面的指令(第三条和第四条)取到F2的结果(可以理解为前半拍在读,后半拍读出)

              第五条指令:流出

第九拍:第三条指令、第四条指令:读操作数

               第五条指令:因为需要的F0需要前面乘法指令的F0结果,阻塞

               第六条指令:加法部件被占用,不能流出

第十拍、第十一拍:第三条指令、第四条指令:执行两拍(减法执行两拍完成)

               

    

第十二拍:减法指令将结果写回到F8中,释放加法部件

第十三拍:第六条指令:流出

    

第十四拍:第六条指令:读操作数

第十五拍、第十六拍:执行两拍

    

第十七拍:加法指令能否写回呢? 检查是否有先读后写相关  -有

第十九拍:乘法指令执行完成

第二十拍:乘法指令将结果写回

    

第二十一拍:除法指令拿到F0的值,读操作数(F0、F6),此时F6就不被占用了

第二十二拍:加法指令写回

一直到第61拍:除法才执行完成

   

第62拍:将结果写回,整个程序运行完成

从图中可以看出,读出的顺序是顺序的,读操作数和执行则是乱序的,而写结果的顺序也是乱序的。

增加的是什么呢?

        是大量的连线,从记分牌连到所有的功能部件,所有的寄存器

猜你喜欢

转载自blog.csdn.net/weixin_42596333/article/details/104221304
今日推荐