台式机
流水线中的相关培训教程[4]
下面讨论如何利用编译器技术来减少这种必须的暂停,然后论述如何在流水线中实现数据相关检测和定向。
5. 对数据相关的编译器调度方法
流水线常常会遇到许多种类型的暂停。比如,采用典型的代码生成方法对A = B + C这种常用的表达式进行处理,可以得到如图3.3.14所示的指令序列。从图3.3.14可以看出,在 ADD 指令的流水过程中必须插入一个暂停时钟周期,以保证变量C的读入值有效。既然定向无法消除指令序列中所包含的这种暂停,那么能否让编译器在进行代码生成时就消除这些潜在的暂停呢?
实际上,编译器的确可以通过重新组织代码顺序来消除这种暂停。通常称这种重新组织代码顺序消除暂停的技术为流水线调度(pipeline scheduling)或指令调度(instruction scheduling)。
例 3.6 请为下列表达式生成没有暂停的DLX代码序列。假设载入延迟为1个时钟周期。
a = b - c;
d = e - f;
解: 调度前后的指令序列如表3.2所示。可以看出,两条ALU指令(ADD Ra,Rb,Rc 和 SUB Rd,Re,Rf)分别和两条Load指令(LW Rc,c和LW Rf,f)之间存在数据相关。为了保证流水线正确执行调度前的指令序列,必须在指令执行过程中插入两个时钟周期的暂停。但是考察调度后的指令序列不难发现,由于流水线允许定向,就不必在指令执行过程中插入任何暂停周期。
6. 对DLX流水线控制的实现
让一条指令从流水线的指令译码段(ID)移动到执行段(EX)的过程通常称为指令发射,而经过了该过程的指令为已发射的指令。
对于 DLX 标量流水线而言,所有的数据相关均可以在流水线的 ID段 检测到,如果存在数据相关,指令在其发射之前就会被暂停。这样,我们可以在 ID段 决定需要什么样的定向,然后设置相应的控制。在流水线中较早地检测到相关,可以降低实现流水线的硬件复杂度,因为这样不必在流水过程中被迫将一条已经改变了机器状态的指令挂起。另外一种方法是在使用一个操作数的时钟周期开始(DLX 流水线的 EX 和 MEM 段的开始)检测相关,确定必需的定向。
为了说明这两种方法的不同,我们将以 Load 指令所引起的 RAW 相关为例,论述如何通过在 ID段 的检测来实现流水线控制,其中到 ALU 输入的定向路径可以在 EX 段。表3.3列出了流水线相关检测硬件可以检测到的各种相关情况。
现在来看看如何实现流水线互锁。如果某条指令和 Load 指令有一个 RAW 相关时,该指令处于 ID段,Load 指令处于 EX段。我们可以用表3.4来描述此时所有可能的相关情况。
一旦硬件检测到上述 RAW 相关,流水线互锁必须在流水线中插入暂停周期,使正处于 IF 和 ID段 的指令不再前进。另外,还必须暂停向前传送 IF/ID 寄存器组的内容,使得流水线能够保持被暂停的指令。
对定向而言,虽然可能要考虑许多情况,但是定向逻辑的实现方法是类似的。实现定向逻辑的关键是,流水线寄存器不仅包含了被定向的数据,而且包含了目标和源寄存器域。从上面的讨论可知,所有定向都是从 ALU 或数据存储器的输出到 ALU、数据存储器或0检测单元的输入的定向,我们可以分别将 EX/MEM 和 MEM/WB 段的寄存器 IR 同 ID/EX 和 EX/MEM 段中的寄存器 IR 相比较,决定是否需要定向,从而实现必需的定向控制。
定向的控制硬件除了需要用比较器和组合逻辑来确定什么时候打开哪一条定向路径之外,还需要在 ALU 输入端采用具有多个输入的多路器,并增加相应的定向路径连接通路。改进图3.2.17中的相关硬件,可以得到图3.3.15,图中画出了所增设的定向路径。
全部0条评论
快来发表一下你的评论吧 !