当前位置:文档之家› DLX流水线技术数据相关与结构相关

DLX流水线技术数据相关与结构相关

DLX流水线技术数据相关与结构相关
DLX流水线技术数据相关与结构相关

3.3.2流水线的数据相关

1. 数据相关简介

当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使得读/写操作顺序不同于它们非流水实现的顺序,这将导致数据相关。首先让我们考虑下列指令在流水线中的执行情况: ADD R1, R2, R3

SUB R4, R5, R1

AND R6, R1, R7

OR R8, R1, R9

XOR R10, R1, R11

ADD指令后的所有指令都要用到ADD指令的计算结果,如图3.3.4所示, ADD 指令在WB 段才将计算结果写入寄存器 R1 中,但是 SUB 指令在其 ID 段就要从寄存器 R1 中读取该计算结果,这种情况就叫做数据相关。除非有措施防止这一情况出现,否则 SUB 指令读到的是错误的值。所以,为了保证上述指令序列的正确执行,流水线只好暂停 ADD 指令之后的所有指令,直到 ADD 指令将计算结果写入寄存器 R1 之后,再启动 ADD 指令之后的指

令继续执行。

从图3.3.4还可以看到, AND 指令同样也将受到这种相关关系的影响。 ADD 指令只有到第五个时钟周期末尾才能结束对寄存器 R1 的写操作,所以 AND 指令在第四个时钟周期从寄存器 R1 中读出的值也是错误的。而 XOR 指令则可以正常操作,因为它是在第六个时钟周期读寄存器 R1 的内容。

另外,利用DLX流水线的一种简单技术,可以使流水线顺利执行 OR 指令。这种技术就是:在 DLX 流水线中,约定在时钟周期的后半部分进行寄存器文件的读操作,而在时钟周期的前半部分进行寄存器文件的写操作。在本章的图中,我们将寄存器文件的边框适当地画成虚线来表示这种技术。

2. 通过定向技术减少数据相关带来的暂停

图3.3.4中的数据相关问题可以采用一种称为定向(也称为旁路或短路)的简单技术来解决(动画演示)。定向技术的主要思想是:在某条指令(如图中的 ADD 指令)产生一个计算结果之前,其它指令(如图中的 SUB 和 AND 指令)并不真正需要该计算结果,如果能够将该计算结果从其产生的地方(寄存器文件 EX/MEM)直接送到其它指令需要它的地方(ALU 的输入寄存器),那么就可以避免暂停。基于这种考虑,定向技术的要点可以归纳为:

(1) 寄存器文件 EX/MEM 中的 ALU 的运算结果总是回送到 ALU 的输入寄存器。

(2) 当定向硬件检测到前一个 ALU 运算结果的写入寄存器就是当前 ALU 操作的源寄存器时,那么控制逻辑将前一个 ALU 运算结果定向到 ALU 的输入端,后一个 ALU 操作就不必从源寄存器中读取操作数。

图3.3.4还表明,流水线中的指令所需要的定向结果可能并不仅仅是前一条指令的计算结果,而且还有可能是前面与其不相邻指令的计算结果,图是采用了定向技术后上述例子的执行情况,其中寄存器文件和功能单元之间的箭头表示定向路径。上述指令序列可以在图中

顺利执行而无需暂停。

上述定向技术可以推广到更一般的情况,可以将一个结果直接传送到所有需要它的功能单元。也就是说,一个结果不仅可以从某一功能单元的输出定向到其自身的输入,而且还可以从某一功能单元的输出定向到其它功能单元的输入。

(1) 写后读相关(RAW:Read After Write)(命名规则):j 的执行要用到 i 的计算结果,当它们在流水线中重叠执行时,j 可能在 i 写入其计算结果之前就先行对保存该结果的寄存器进行读操作,从而得到错误的值。这是最常见的一种数据相关,图3.3.6和图中采用定向技术消除的数据相关就属于这种类型。

(2) 写后写相关(WAW:Write After Write ):j 和 i 的目的寄存器相同,当它们在流水线中重叠执行时,j 可能在 i 写入其计算结果之前就先行对该结果寄存器进行写操作,从而导致写入顺序错误,在目的寄存器中留下的是 i 写入的值,而不是 j 写入的值。

如果在流水线中不只一个段可以进行写操作,或者当流水线暂停某条指令时,允许该指令之后的指令继续前进,就可能会产生这种类型的数据相关。由于 DLX 流水线只在 WB 段写寄存器,所以在 DLX 流水线中执行的指令不会发生这种类型的数据相关。如果我们对DLX流水线作如下改变,在DLX流水线中执行的指令就有可能发生WAW相关。首先,将 ALU 运算结果的写回操作移到 MEM 段进行,因为这时计算结果已经有效;其次,假设访问数据存储器占两个流水段。下面是两条指令在修改后的 DLX 流水线中执行的情况:

可以看出,在修改后的 DLX 流水线中执行上述指令序列后,寄存器 R1 中的内容是第一条指令(LW)的写入结果,而不是 ADD 指令的写入结果。这就是由于 WAW 相关所带来的错误执行结果。

(3) 读后写相关(WAR:Write After Read ):j 可能在 i 读取某个源寄存器的内容之前就先对该寄存器进行写操作,导致 i 后来读取到的值是错误的。

由于 DLX 流水线在 ID 段完成所有的读操作,在 WB 段完成所有的写操作。所以,在 DLX 流水线中不会产生这种类型的数据相关。基于上面修改后的 DLX 流水线,考察下面两条指令的执行情况:

如果 SW 指令在 MEM2 段的后半部分读取寄存器 R2 的值,ADD 指令在 WB 段的前半部分将计算结果写回寄存器 R2,则 SW 将读取错误的值,将 ADD 指令的计算结果写入存储器中。值得注意的是,在读后读(RAR: Read After Read)的情况下,不存在数据相关问题。

4. 需要暂停的数据相关

前面我们讨论了如何利用定向技术消除由于数据相关带来的暂停。但是,并不是所有数据相关带来的暂停都可以通过定向技术消除。

为了保证流水线正确执行上述指令序列,可以设置一个称为流水线互锁(pipe line interlock)的功能部件。一旦流水线互锁检测到上述数据相关,流水线暂停执行LW 指令之后的所有指令,直到能够通过定向解决该数据相关为止。

图3.3.12为流水线互锁插入暂停后流水线数据通路;

图3.3.13是加入暂停前后的流水线时空图。

下面讨论如何利用编译器技术来减少这种必须的暂停,然后论述如何在流水线中实现数

据相关检测和定向。

5. 对数据相关的编译器调度方法

流水线常常会遇到许多种类型的暂停。比如,采用典型的代码生成方法对A = B + C这种常用的表达式进行处理,可以得到如图3.3.14所示的指令序列。从图可以看出,在 ADD 指令的流水过程中必须插入一个暂停时钟周期,以保证变量C的读入值有效。既然

定向无法消除指令序列中所包含的这种暂停,那么能否让编译器在进行代码生成时就消除这些潜在的暂停呢

实际上,编译器的确可以通过重新组织代码顺序来消除这种暂停。通常称这种重新组织代码顺序消除暂停的技术为流水线调度(pipeline scheduling)或指令调度(instructio n scheduling)。

例请为下列表达式生成没有暂停的DLX代码序列。假设载入延迟为1个时钟

周期。

a =

b - c;

d =

e - f;

解:调度前后的指令序列如表所示。可以看出,两条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 段。表列出了流水线相关检测硬件可以检测到的各种相关情况。

现在来看看如何实现流水线互锁。如果某条指令和 Load 指令有一个 RAW 相关时,该指令处于 ID段,Load 指令处于 EX段。我们可以用表来描述此时所有可能的相关情况。

一旦硬件检测到上述 RAW 相关,流水线互锁必须在流水线中插入暂停周期,使正处于 IF 和 ID段的指令不再前进。另外,还必须暂停向前传送 IF/ID 寄存器组的内容,使得流水线能够保持被暂停的指令。

对定向而言,虽然可能要考虑许多情况,但是定向逻辑的实现方法是类似的。实现定向逻辑的关键是,流水线寄存器不仅包含了被定向的数据,而且包含了目标和源寄存器域。从上面的讨论可知,所有定向都是从 ALU 或数据存储器的输出到 ALU、数据存储器或0检测单元的输入的定向,我们可以分别将 EX/MEM 和 MEM/WB 段的寄存器 IR 同 ID/E X 和 EX/MEM 段中的寄存器 IR 相比较,决定是否需要定向,从而实现必需的定向控制。

定向的控制硬件除了需要用比较器和组合逻辑来确定什么时候打开哪一条定向路径之外,还需要在 ALU 输入端采用具有多个输入的多路器,并增加相应的定向路径连接通路。改进图3.2.17中的相关硬件,可以得到图,图中画出了所增设的定向路径。

在 DLX 中,任何流水线寄存器到任何功能单元的输入都可能需要定向路径。前面的一些数据相关的实例均是有关寄存器操作数的,但是数据相关也有可能发生在一对指令对存储器同一单元进行读写的时候。不过,本章仅讨论有关寄存器的数据相关。

3. 数据相关的分类

根据指令对寄存器的读写顺序,可以将数据相关分为三类。习惯上,这些相关是根据流水线所必须保持的访问顺序来命名的。考虑流水线中的两条指令 i 和 j ,且 i 在 j 之前进入流水线,由此可能带来的数据相关有:

相关主题
文本预览
相关文档 最新文档