5.3 动态调度技术 主要依靠硬件来动态调整指令的执行顺序可以减少数据相关造成的影响,能够处理在编译时无法确定的某些数据相关,并简化编译器。 下面,首先介绍指令的乱序执行方式及在乱序执行过程中的数据相关,然后分析几种处理数据相关的方法,最后给出一种典型的指令动态调度算法。 5.3.1 顺序流动与乱序流动 在一般情况下,一串连续任务在流水线中是一个接一个地在各个流水段中间流过的。从流水线的输出端看,任务流出流水线的顺序与输入端的任务流入顺序完全相同,这种控制方式称为顺序流动方式。如图5.39所示的一条6段指令流水线,在正常情况下,6个流水段、、……、分别同时执行k、k+1、……、k+5共6条指令,如图5.40中的下面一行。
在图5.39中,流水段要读操作数,流水段写运算结果。现在把如下一段程序输入到这条流水线中: 其中,指令k与指令k+2之间有"先写后读"数据相关。在时钟周期ti,指令k+2在流水段中要读操作数;但是,由于指令k还没有到达流水段;因此,指令k+2无法继续执行,要在流水段中等待。如图5.40所示,后续的指令k+4、k+5、……等也不能进入流水线。在以后的ti+1、ti+2、ti+3、……时钟周期,流水段、、将逐渐空闲。在时钟周期ti+3,指令k执行完成,把运算结果写到寄存器R0中。从时钟周期ti+4开始,指令又可以在流水线中继续往前流动。然而,三个"空闲段"要在流水线的后四个流水段中流过,直至全部流出流水线。
从上面的分析及图5.40中可以看出,采用顺序流动方式,在程序中有"先写后读"数据相关时,流水线可能会"断流",这将降低流水线的吞吐率和效率。