• 内容讲解

指令流水线的一个特点是流水线中的各条指令之间存在一些相关性,使得指令的执行受到影响。

要使流水线发挥高效率,就要使流水线连续不断地流动,尽量不出现断流情况。然而,由于流水过程中存在的相关性冲突,断流现象是不可避免的。

1.数据相关

在流水计算机中,指令的处理是重叠进行的,前一条指令还没有结束,第二、三条指令就陆续开始工作。由于多条指令的重叠处理,当后继指令所需的操作数刚好是前一指令的运算结果时,便发生数据相关冲突。由于这两条指令的执行顺序直接影响到操作数读取的内容,必须等前一条指令执行完毕后才能执行后一条指令。在这种情况下,这两条指令就是数据相关的。因此,数据相关是由于指令之间存在数据依赖性而引起的。

根据指令间对同一寄存器读和写操作的先后次序关系,可将数据相关性分为写后读(Read-After-Write,RAW)相关、读后写(Write-After-Read,WAR)相关、写后写(Write-After-Write,WAW)相关三种类型。

解决数据相关冲突的办法如下:

(1)采用编译的方法

编译程序通过在两条相关指令之间插入其他不相关的指令(或空操作指令)而推迟指令的执行,使数据相关消失,从而产生没有相关性的程序代码。这种方式简单,但降低了运行效率。

(2)由硬件监测相关性的存在,采用数据旁路技术设法解决数据相关

当前一条指令要写入寄存器而下一条指令要读取同一个寄存器时,在前一条指令执行完毕、结果数据还未写入寄存器前,由内部数据通路把该结果数据直接传递给下一条指令,也就是说,下一条指令所需的操作数不再通过读取寄存器获得,而是直接获取。这种方式效率较高,但控制较为复杂。

2.资源相关

所谓资源相关,是指多条指令进入流水线后在同一机器周期内争用同一个功能部件所发生的冲突。

例如,在图5-22所示的标量流水计算机中,在第4个时钟周期时,第1条指令处于访存取数(MEM)阶段,而第4条指令处于取指令(IF)阶段。如果数据和指令存放在同一存储器中,且存储器只有一个端口,这样便会发生这两条指令争用存储器的资源相关冲突。

因为每一条指令都可能需要2次访问存储器(读指令和读写数据),在指令流水过程中,可能会有2条指令同时需要访问存储器,导致资源相关冲突。

解决资源相关冲突的一般办法是增加资源,例如增设一个存储器,将指令和数据分别放在两个存储器中。

3.控制相关

控制相关冲突是由转移指令引起的。当执行转移指令时,依据转移条件的产生结果,可能顺序取下一条指令,也可能转移到新的目标地址取指令。若转移到新的目标地址取指令,则指令流水线将被排空,并等待转移指令形成下一条指令的地址,以便读取新的指令,这就使得流水线发生断流。

为了减小转移指令对流水线性能的影响,通常采用以下两种转移处理技术:

(1)延迟转移法

由编译程序重排指令序列来实现。其基本思想是“先执行再转移”,即发生转移时并不排空指令流水线,而是继续完成下几条指令。如果这些后继指令是与该转移指令结果无关的有用指令,那么延迟损失时间片正好得到了有效的利用。

(2)转移预测法

用硬件方法来实现。依据指令过去的行为来预测将来的行为,即选择出现概率较高的分支进行预取。通过使用转移取和顺序取两路指令预取队列以及目标指令Cache,可将转移预测提前到取指令阶段进行,以获得良好的效果。