单条指令中的数据冒险

Data hazards in a single instruction

考虑以下 mips 代码片段

add $t1, $t1,$t2
lw $t1, 0($sp)

我知道在指令 1 和 2 之间 $t1 上存在 WAW 数据风险,但是第 1 行是否存在 WAR 风险,因为我们读取并写入 $t1 在一条指令中?

我们认为 WAR 危险是机器乱序的问题,因为在程序顺序之外执行指令。

给定程序

add $t4, $t1, $t5 ; instruction 1, program order
add $t5, $t1, $t2 ; instruction 2, program order

故障机器可以决定并行执行 1 和 2,甚至先执行 2 再执行 1,因为它们之间没有数据依赖性(无 RAW)。这为 WAR 危险创造了机会——如果指令 2 比指令 1 完成得早得多,没有缓解措施,指令 1 会错误地看到指令 2 的 $t5 值——让我们注意这个新值是一个真实的该寄存器的程序值(只是它对先前的指令无效)因此,这为 $t5.

提供了 2 个不同的可能值

is there a WAR hazard on line 1 because we read from and write to $t1 in a single instruction?

不,在单个指令中,如 add $t1, $t1, $t2,处理器在计算加法结果之前没有新值 $t1,为此它必须已经找到 $t1$t2 — 因此,将新值与旧值(在一条指令内)混淆是不可能的,因为新值在添加时尚不存在。没有其他顺序可以使新值在实际添加之前就存在。