ILP——指令级并行2:记分牌技术
硬件方法的指令级并行
为什么要用硬件调度方案?因为有时候编译时无法确定相关。
基本思想:允许stall后的指令继续向前流动(这么说可能有点抽象,简单的理解就是若是你因为相关被stall了,就让你后面的没有被stall的指令先来,很现实的一个思路),这种思路导致了一个基本特点:顺序发射,乱序执行
举个简单的例子:银行取钱
假设某银行是流水线操作,取钱依次经过 取号,填单子,柜台取钱,开凭据,拿回存折五个步骤
顺序发射就是指的是每个人都按照来的先后顺序来取号;
但是,有些人取钱忘记带存折身份证,导致无法填单子,这时候就得回去取存折身份证,让后面的人先填单子,但是后面的人填完单子又忘了要去多少钱,就得再让后面的人先取钱,等到自己当前步骤需要的材料都准备好了再从上次停留的状态继续执行。
这也就是乱序执行的意思。
一、记分牌(Scoreboard)技术
-
技术要点
先放上一张糊图,展现了记分牌技术的步骤。
-
记分牌技术在原本流水线的基础上增加了一个硬件部件,成为Scoreboard,其用来记录各个功能部件的使用情况以便每条指令来根据此来判断是否可以执行,后面会对此结构进行详细介绍。
-
流水线部分,将ID段拆分成issue和read operands两个阶段,issue阶段完成译码工作,也完成检测结构相关工作;read operands即操作数,其需要等待没有数据相关时才能进行,即每次都要和scoreboard比对,曲儿当前需要的操作数已经准备好才读取,否则就会stall这条指令让后面有条件的指令先执行。
-
-
各个流水线段的工作
- Issue段:指令译码,检测结构相关。检测当前指令所需的功能部件(如整数乘法器,浮点数乘法器等)是否空闲,检测当前指令的目的寄存器是否被其他指令作为目的寄存器占用(通过这一步解决了WAW相关)。若两者有一不满足,则停止发射当前指令,也不发射后续指令(这就保证了顺序发射)
- Read operands段:通过scoreboard检测当前指令需要的源寄存器是否被其他已发射指令寄存器作为目的寄存器占用。如果没有,则读取相应的值作为操作数,否则该条指令stall,让后面指令先执行(这一步解决RAW相关,同时导致了乱序执行)
- Execution段:接收到操作数后,相应的功能部件开始执行;当计算完成后,通知scoreboard可以结束此指令的执行,释放指令对改功能部件的占用
- WB段:scoreboard得到执行结束的消息后,检测指令的写回寄存器是否被作为源寄存器读取,即检测WAR相关。如有WAR相关,就暂停该指令;没有就正常写回。
-
记分牌的结构
由上可以看出,scoreboard需要保存不少系统的执行信息用来检测各种相关
分析:
从Issue段可以看到,为了检测结构相关,需要保存每个功能部件的状态,记录该功能部件当前是否空闲,若非空闲,操作数是啥,操作数是否准备好,进行的操作是啥,目的寄存器是啥,源操作数由哪个部件产生;
检测WAW相关则需要记录每个寄存器当前是否被某条指令占用作为目的寄存器,其中保存写回数据的产生的功能部件;
RAW、WAR相关已经可以通过上面两个结构来检测了。
当然,因为指令的乱序执行,我们还需要一个结构来记录每条指令的执行状态。
下面给出记分牌的结构
-
Instruction Status——记录正在执行的各条指令所处的状态步
上图中,表格中数字 n 表示相应指令(行)的相应状态(列)在n个周期执行,还未执行的阶段是空白的
-
Functional unit status——记录功能部件(FU)的状态。 用9个域记录每个功能部件的9个参量 :
Busy Op Fi Fj Fk Qj Qk Rj Rk 指示部件是否空闲 该部件的操作 目的寄存器编号 源寄存器1编号 源寄存器2编号 源操作数1的产生部件 源操作数2的产生部件 源操作数1是否就绪 源操作数2是否就绪
结构如上图所示。
-
Register result status ——如果存在功能部件对某一寄存器进行写操作, 指示具体是哪个功能部件对该寄存器进行写操作。如果没有指令对该寄存器进行写操作, 则该域为Blank
-
-
几个问题
-
为什么要采用顺序发射?
因为顺序发射可以知道某条指令的结果会流向哪条指令,如果乱序发射则会混淆RAW,WAR相关
-
记分牌的主要思想?
顺序发射,乱序执行乱序完成;
发射前检测结构相关和WAW相关;
读操作数前检测RAW相关;
写结果前处理WAR相关。
-
缺陷?
存在结构相关和WAW相关时无法发射后续指令,导致整个流水线空闲;
没有转发操作;
-