FromComputerArchitecture: A Quantitative Approach, Fifth Edition
Score-boarding
---is a techniquefor allowing instructions to execute out of order where there is sufficientresources and no data dependences
计分板技术是允许在资源充足和没有数据相关的情况下乱序执行指令;CDC6600发展了这种技术。计分板的目标是:通过尽早执行指令,保证每个时钟周期1条指令的执行顺序,即当某条要执行的指令被停顿时,其他没有相关于任何正在执行或停顿指令的指令能够接着发射并执行。计分板技术全面负责指令的发射与执行,包括所有的冒险检测。
带有计分板的MIPS处理器的基本结构,计分板的功能是控制指令的执行,所有数据通过data bus 在寄存器和功能单元之间流动。
每条指令在执行的过程中经历四个阶段(主要考虑浮点操作,因而不考虑涉及访问存储器的阶段):
1. 发射,若指令所使用的功能单元空闲,且无其他单元与其抢用目标寄存器,则计分板将指令发射到相应功能单元,并更新自己的内部数据结构。杜绝WAW冒险出现。
2. 读操作数,计分板监视操作数的可用情况,一旦操作数可用,计分板便会通知相应功能单元读取该操作数并开始执行。这种方法解决了RAW冒险。
3. 执行,功能单元获得操作数后开始执行,执行结束后产生结果,并告知计分板。
4. 写回结果,一旦计分板知道那个单元执行完毕,则会检测WAR冒险,若有,则停顿。
计分板由三部分组成:
1. 指令状态表
2. 功能状态表
3. 寄存器结果状态表
如下图,为带5个功能单元的MIPS计分板的数据结构:
Tomasulo’s algorith---与计分板技术的主要区别在于Tomasulo算法通过对寄存器进行有效动态重命名来处理反相关和输出相关,可以对Tomasulo算法进行扩展,用来处理推测。
The primary difference is that the Tomasulo’s algorithmhandles antidependence and output dependence by effectively remaining theregisters dynamically.
Dynamic scheduling using Tomasulo’s approach
通过寄存器重命名,可以消除由名字相关引起的WAR和WAW冒险(源于名称相关)。寄存器重命名是指通过重命名所有的目标寄存器,包括指令序列中位置靠前的指令将要读和写的寄存器,从而消除相关,使乱序写入不会影响任何依赖某一操作数较早值的指令。
Register renaming eliminates the WAR and WAW by renaming alldestination registers,including those with a pending read or write for an earlierinstruction, so out-of-order write does not affect any instructions thatdepends on an earlier value of an operands.
如下面这段代码序列,其中隐含着WAR和WAW冒险:
该例子中,两处反相关:ADD.D和SUB.D之间存在反相关,S.D和MUL.D之间。在ADD.D和MUL.D之间存在输出相关。三处冒险:ADD.D对F8的操作会引起WAR冒险,SUB.D对F6操作时的WAR冒险,ADD.D可能会晚于MUL.D完成,会引起WAW冒险。同时该代码段中还存在三种真正的数据相关:DIV.D和ADD.D之间,SUB.D和MUL.D之间,ADD.D和S.D之间。
以上的名称相关可以通过寄存器重命名来消除,使用临时寄存器S和T:
后续指令中所有对F8的使用都用寄存器T代替,对F6的操作用S代替,可由编译器静态完成重命名。
在Tomasulo算法中,寄存器重命名是通过保留站实现的,保留站会为等待发射的指令保存操作数。其基本思想是:当操作数可用时,保留站马上取操作数并将其缓存,从而避免从寄存器中读操作数。此外,等待执行的指令会指定保留站,为自己提供输入。最后,当寄存器的后续写操作在执行过程中发生重叠时,只使用最后一个操作数更新寄存器。在发射指令时,会将待用操作数的寄存器说明符更名,改为保留站的名字,既实现了寄存器重命名。
图3.6 The basic structure of a MIPSfloating-point unit using Tomasulo’ algorithm.
使用Tomasulo算法的MIPS浮点单元的基本结构
指令从指令单元被送往指令队列,在指令队列中,指令按FIFO顺序发射。 保留站中包含操作数和运算符,及用来检测和解决冒险的信息。Load缓存具有三个功能:保存有效地址的各个部分直至计算完成,等待将要访问存储器的load指令,为已完成且正在等待的CDB的load指令保存结果。同理,store缓存也有三个功能:保存有效地址的各个部分直至计算完成,位正在等待数据的store命令保存目标存储器地址,在存储器单元可用之前保留地址和等待写回的值。来自浮点单元和load单元的所有结果都被送往CDB,这些结果被送往浮点寄存器,保留站和store缓存。
CDB,common data bus,公共数据总线,可以使等到操作数的所有单元可以同时取到该操作数。
FP adder浮点加法器执行加减运算,FP multipliers 浮点乘法器执行乘除运算。
尽管每条指令花费的时钟周期不同,但总体上可分为三个阶段:
1. Issue,发射。从指令队列中取到下一条指令,FIFO顺序。如果有匹配的空闲保留站,且指令的操作数在寄存器中,则将指令及操作数的值发射到该保留站中,如果没有空闲保留站,这说明发生了结构冒险,指令会被停顿,直至出现可用的保留站或缓存。若操作数不在寄存器中,则需要寄存器重命名,消除WAR和WAW冒险。
2. Excute,执行。如果有一个或多个操作数处于不可用状态,则监视公共数据总线,等待这些操作数被计算出来。当一个操作数可用时,该操作数被放入等待它的保留站中,当指令所需要的所有操作数就绪,则将该指令放在响应的功能单元中执行。
3. Writeresult,写结果。当结果就绪时,需要将其写到CDB上,并送往等待它的寄存器或保留站。