5.7 流水线中的主要问题

5.7 流水线中的主要问题

事实上,不是所有指令都能做成流水线方式,因为在流水过程中可能会出现因为两条指令之间存在相关而无法重叠执行或只能部分重叠执行。

相关是指两条指令之间存在某种依赖关系。如果指令之间没有任何关系,那么当流水线有足够的硬件资源时,它们就能在流水线中顺利地重叠执行。但如果两条指令相关,即存在依赖关系,那么它们就不能顺利地完全重叠执行。相关有三种类型:结构相关、数据相关和控制相关。

1.结构相关

流水线中多条指令在同一时间争用同一个功能部件而导致流水不能继续运行的现象。例如,流水线上的两条指令在同一时间内均要访问主存。

解决方法:

(1)后续指令冲突部件推后一拍执行(时间上);

(2)重复设置资源(空间上)。

例如对于访存引起的资源竞争可以用下列方法:用两个存储器:指令存储器/数据存储器;设置指令Cache/数据Cache;采用多端口存储器:一个端口用于指令访存,另一个端口用于数据访存等。

2.数据相关

当相关的指令靠得足够近时,它们在流水线中的重叠执行或重新排序会改变指令读/写操作的顺序,从而导致程序执行逻辑上的错误的现象,该现象称为数据相关冲突。例如,后续指令所需要的操作刚好是前一条指令的运算结果时,便发生数据相关冲突。

解决方法:

后推法:不同拍之间,停顿后继指令的运行,直到前面指令结果生成;在同一拍中,采用推后读、提前写的方法。

在RISC(简单指令集)中特有的方法是,装载延迟则采用联锁硬件检测,并使流水线停顿,直到相关消除。

相关专用通路法:执行结果除写寄存器外,还可直接送到ALU 的操作数保存栈中。

3.控制相关

程序的执行方向可能被改变而引起的流水线障碍,通常是由转移指令引起的,当执行转移类指令进入流水线时,依据转移条件的产生结果,可能为顺序取下一条指令,也可能转移到新的目标地址取指令,从而使流水线发生断流。

处理分支指令最简单的方法是:冻结或者排空流水线。