0

考虑以下 mips 代码片段

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

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

4

1 回答 1

2

我们认为 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值——让我们注意这个新值是该寄存器的真实程序值(只是它对先前的说明无效)因此,这为 . 提供了 2 个不同的可能值$t5


第 1 行是否存在 WAR 危险,因为我们在一条指令中读取和写入 $t1?

不,在单个指令中,就像add $t1, $t1, $t2处理器在$t1计算加法结果之前$t1没有$t2新值值(在指令内),因为在添加时新值还不存在。没有其他顺序可以使新值在实际添加之前存在。

于 2020-11-20T15:28:28.667 回答