在计算机体系结构中,Read-after-Write (RAW) hazard 之所以叫“读后写”,是因为它描述的是逻辑上的依赖关系,而不是指令执行的物理顺序。我们来看一下这个命名的逻辑:
-
依赖关系:RAW冒险描述的是一个指令“必须在”另一指令写入完成之后再读取数据的依赖关系。因此,我们称之为“读在写之后”(Read-after-Write),因为这个读取操作必须发生在写入操作之后才能获得正确的数据。
-
物理顺序与逻辑顺序:在流水线或并行执行的情况下,指令可能同时在不同阶段执行。因此,如果在写入操作完成之前,读取操作已经开始,就会出现数据不一致的情况。这就是RAW冒险的产生原因。
-
示例:
- 假设有两个指令:
- 指令1:
r3 ← r1 op r2
(将计算结果写入r3
) - 指令2:
r5 ← r3 op r4
(从r3
中读取数据)
- 指令1:
- 这里,指令2依赖于指令1的结果,即 指令2的读取需要在指令1写入
r3
之后进行。 - 如果指令2在指令1写入
r3
之前就尝试读取r3
,会得到错误的数据,导致RAW冒险。 <
- 假设有两个指令: