流水线冒险及解决方法
流水线冒险及解决方法
相关----由于一段机器语言程序的邻近指令之间出现了某种关联后,为了避免出错而使得它们不能同时被解释的现象,又称相关冲突。
在流水解释过程中可能会出现三种相关,这三种相关是资源相关、数据相关和控制相关。
1. 资源相关
资源相关----是指多条指令进入流水线后在同一个时钟周期内争用同一功能部件所发生的相关。
在图1所示的流水解释时空图中,在第4个时钟周期时,第I1条指令的MEM段与第I4条指令的IF段都要访问存储器。当数据和指令混存在同一个存储器且只有一个访问端口时,便会发生两条指令争用同一个存储器资源的相关冲突。
图1 指令流水解释的时空图
解决资源相关的方法主要有以下五种:
(1)从时间上推后下一条指令的访存操作。
(2)让操作数和指令分别存放于两个独立编址且可同时访问的主存储器中。
(3)仍然维持指令和操作数混存,但采用多模块交叉主存结构。
(4)在CPU内增设指令Cache。
(5)在CPU内增设指令Cache和数据Cache。
2. 数据相关
数据相关----是指由于相邻的两条或多条指令使用了相同的数据地址而发生的关联。这里所说的数据地址包括存储单元地址和寄存器地址。
例如,有如下三条指令依次流入如图2所示的流水线:
ADD R1,R2,R3 ;(R2)+(R3)→R1
SUB R1,R4,R5 ;(R4)-(R5)→R1
AND R4,R1,R7 ;(R1)∧(R7)→R4
图2 三条指令流水解释的时空图
第三条指令与前面两条指令之间存在着关于寄存器R1的先写后读(RAW)数据相关。
解决数据相关的方法主要有以下两种:
(1)推后相关单元的读。
图 3三条指令流水解释的时空图(用方法1解决数据相关)
(2)设置相关专用通路,又称采用定向传送技术。
图4 相关专用通路
图5 三条指令流水解释的时空图(用方法2解决数据相关)
推后相关单元的读和设置相关专用通路是解决流水解释方式中数据相关的两种基本方法。推后相关单元的读是以降低速度为代价,使设备基本上不增加,而设置相关专用通路是以增加硬件为代价,使流水解释的性能尽可能不降低。
对流水的流动顺序的安排和控制可以有两种方式:顺序流动方式和异步流动方式。
顺序流动方式----是指流水线输出端的任务(指令)流出顺序和输入端的流入顺序一样。
顺序流动方式的优点是控制比较简单。其缺点是一旦发生数据相关后,在空间和时间上都会有损失,使得流水线的吞吐率和功能部件的利用率降低。
异步流动方式----是指流水线输出端的任务(指令)流出顺序和输入端的流入顺序可以不一样。
异步流动方式的优点是流水线的吞吐率和功能部件的利用率都不会下降。但采用异步流动方式带来了新的问题,采用异步流动的控制复杂,而且会发生在顺序流动中不会出现的其它相关。由于异步流动要改变指令的执行顺序,同时流水线的异步流动还会使相关情况复杂化,会出现除先写后读(RAW)相关以外的先读后写(WAR)相关和写写(WAW)相关。
3. 控制相关
控制相关----是指由转移指令引起的相关。
解决控制相关的方法主要有以下两种:
(1)延迟转移技术。
延迟转移技术----将转移指令与其前面的与转移指令无关的一条或几条指令对换位置,让成功转移总是在紧跟的指令被执行之后发生,从而使预取的指令不作废。
(2)转移预测技术。
转移预测技术可分为静态转移预测和动态转移预测两种(由硬件来实现)。
静态转移预测技术有两种实现方法:
一种是分析程序结构本身的特点来进行预测。不少条件转移指令转向两个目标地址的概率是能够预估的,如若x86汇编语言中连续的两条语句为“ADD AX,BX”、“JNZ L1”,则转向标号L1的概率要高,只要编译程序把出现概率高的分支安排为猜选分支,就能显著减少由于处理条件转移所带来的流水线吞吐率和效率的损失。
另一种是按照分支的方向来预测分支是否转移成功。一般来说,向后分支被假定为循环的一部分而且被假定为发生转移,这种静态预测的准确性是相当高的。向前分支被假定为条件语句的一部分而且被假定为不发生转移,这种静态预测的准确性比向后分支的准确性要低得多。
要提高预测的准确度,可以采用动态预测的方法,在硬件上建立分支预测缓冲站及分支目标缓冲站,根据执行过程中转移的历史记录来动态的预测转移目标,其预测准确度可以提高到90%以上。这种方法已在现代微处理器的转移预测中得到了广泛应用。例如,Pentium 4微处理器中的L1 BTB(Branch Target Buffer,转移目标缓冲器)采用的就是动态转移预测技术,当转移指令不在BTB中时,则采用静态转移预测技术。
在安腾体系结构设计时,采用了一种新的转移预测技术。该技术将传统的分支结构变为无分支的并行代码,当处理机在运行中遇到分支时,它并不是进行传统的分支预测并选择可能性最大的一个分支执行,而是利用多个功能部件按分支的所有可能的后续路径开始并行执行多段代码,并暂存各段代码的执行结果,直到处理机能够确认分支转移与否的条件是真是假时,处理机再把应该选择的路径上的指令执行结果保留下来。采用了这种技术后,可消除大部分转移指令对流水解释的影响,使得整个系统的运行速度得到提高。