DLX流水线技术数据相关与结构相关
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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为流水线互锁插入暂停后流水线数据通路;