在一般情况下,一串连续任务在流水线中是一个接一个地在各个流水段中间流过的。从流水线的输出端看,任务流出流水线的顺序与输入端的任务流入顺序完全相同,这种控制方式称为顺序流动方式。如图8.30所示的一条6段指令流水线,在正常情况下,6个流水段S6、S5、……、S1分别同时执行k、k+1、……、k+5共6条指令,如图8.34中的下面一行。
  图8.30 一条6段指令流水线

  在图8.30中,流水段S2要读操作数,流水段S6写运算结果。现在把如下一段程序输入到这条流水线中:
  k: R0←(R1)
  k+1: ……
  k+2: R2←(R0)+(R3)
  k+3: ……
  k+4: ……
  k+5: ……
  其中,指令k与指令k+2之间有"先写后读"数据相关。在时钟周期ti,指令k+2在流水段S2中要读操作数;但是,由于指令k还没有到达流水段S6;因此,指令k+2无法继续执行,要在流水段S2中等待。后续的指令k+4、k+5、……等也不能进入流水线。

  采用顺序流动方式,在程序中有"先写后读"数据相关时,流水线可能会"断流",这将降低流水线的吞吐率和效率。
  为了充分发挥流水线的效率,在发生数据相关时,要允许没有数据相关的后续指令进入相关指令所占用的流水段,并超越相关的指令继续往前流动,这种控制方式称为乱序流动方式。从一条指令流水线的输出端看,指令流出流水线的顺序与输入端指令输入流水线的顺序是不一样。在流水线的输入端,指令是按照它的地址从小到大顺序进入流水线的;但在流水线的输出端,指令执行完成的顺序可能是混乱的;因此,把流水线的这种控制方式称为乱序(Out of order)流动方式,也称为错序流动方式、无序流动方式或异步流动方式等。

  实际上,造成流水线乱序流动方式的原因不仅仅"先写后读"数据相关,有些指令执行的时间短或经过的流水段比较少,它们要越过执行时间长或经过流水段多的指令向前流动。