在乱序流动方式中,除了有"先写后读"数据相关之外,还可能发生"先读后写"数据相关和"写-写"数据相关。例如,把下面一小段程序输入到流水线中,当指令k+2进入读操作数流水段时,发现指令k与指令k+2之间有"先写后读"数据相关,指令k+2不能继续执行。后续的指令k+3、k+4、……等可以进入读操作流水段先执行,并超越指令k+2进入以后的流水段。由于指令k和指令k+2是乘法指令,执行的时间比较长,指令k+3有可能超越指令k先到达写流水段,把它的执行结果写到了寄存器R3中。于是,当指令k在写流水段执行完成,解除了它与指令k+2之间的"先写后读"数据相关,指令k+2要读寄存器R3;但是,寄存器R3已经被指令k+3修改过了,这就是"先读后写"数据相关。同样,如果指令k+4超越指令k+2先到达写流水段,寄存器R2中的最终结果必然是错误的,这就是"写-写"数据相关。
例题
  

  检测"先写后读"数据相关的方法是在流水线的读操作数流水段设置一个比较器,在读操作数之前,把源操作数地址与已经在流水线中的从读操作数流水段到写结果流水段之间的所有指令的目标地址进行比较,如果发现有一个地址是相等的,则表明发生了"先写后读"数据相关。
  检测"先读后写"数据相关和"写-写"数据相关的方法是在流水线的写结果流水段设置比较器,把自己的目标操作数地址分别与已经进入流水线的指令序号比自己小的源操作数地址和目标操作数地址进行比较,如果发现与某一条指令的源操作数地址相等,则说明发生了"先读后写"数据相关,如果发现与某一条指令的目标操作数地址相等,则说明发生"写-写"数据相关。
  "先写后读"相关又称为数据相关、写读相关、流相关、WR相关、RAW相关等。"先读后写"相关又称为变量名相关、读写相关、反相关、RW相关、WAR相关等。"写-写"相关又称为输出相关、WW相关、WAW相关或写后再写相关等。
  在流水线中避免发生数据相关的方法可以分为两大类,其中一类是延迟执行,另一类是建立专用路径。当流水线的流水段比较多,或者在一个处理机中有多条流水线时,需要的专用路径的条数很多,专用路径的控制非常复杂;因此,出现了多种设置专用路径的方法。如采用分散控制的公共数据总线法(又称为Tomasulo算法),采用集中控制的CDC记分牌法等。
  延迟执行是避免数据相关最简单的方法。这种方法的优点是流水线的控制简单,缺点是流水线的吞吐率和效率低。
  建立专用路径的方法如图8.30所示。通过一条从流水段S5到流水段S3的专用路径,当指令k与指令k+2有"先写后读"数据相关时,流水段S5的输出可以通过这条专用路径直接送到流水段S3的输入。在流水线中建立专用数据路径已经成为高性能处理机普遍采用的方法。
  通过建立专用路径来避免数据相关的基本原理是数据重定向。下面介绍常用的数据重定向的一般原理和基本方法。