当一条指令取决于上一条指令的结果并且尚未计算出该指令的结果时,就会发生数据危险。每当两条不同的指令使用相同的存储器时。该位置必须看起来好像是按顺序执行的。
数据相关性有四种类型:写后读(RAW),读后写(WAR),写后写(WAW)和读后读(RAR)。这些解释如下。
- 写入后读取(RAW):
也称为True依赖项或Flow依赖项。当下一条指令需要一条指令产生的值时,就会发生这种情况。例如,
ADD R1, --, --;
SUB --, R1, --;
需要档位来处理这些危险。
- 读后写(WAR):
也称为反依赖性。当前一条指令读取后立即使用指令的输出寄存器时,会发生这些危险。例如,
ADD --, R1, --;
SUB R1, --, --;
- 写后写(WAW):
也称为输出依赖性。当指令的输出寄存器被前一条指令写入后再写入时,会发生这些危险。例如,
ADD R1, --, --;
SUB R1, --, --;
- 读后读(RAR):
当指令都从同一个寄存器读取时,就会发生这种情况。例如,
ADD --, R1, --;
SUB --, R1, --;
由于读取寄存器值不会更改寄存器值,因此这些读后读(RAR)危害不会对处理器造成问题。
处理数据危害:
我们使用以下各种方法来处理危险:转发,代码记录和停顿插入。
这些解释如下。
- 转发:
它为管道增加了特殊的电路。此方法之所以有效,是因为所需值通过电线的时间比通过管道段计算其结果所需的时间少。 - 代码重新排序:
我们需要一种特殊类型的软件来对代码重新排序。我们称这类软件为依赖于硬件的编译器。 - 堵转:
它将一个或多个安装(无操作指令)插入管道,这会延迟当前指令的执行,直到将所需的操作数写入寄存器文件为止,但是此方法降低了管道效率和吞吐量。