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