单条指令中的数据冒险
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
— 因此,将新值与旧值(在一条指令内)混淆是不可能的,因为新值在添加时尚不存在。没有其他顺序可以使新值在实际添加之前就存在。
考虑以下 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
.
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
— 因此,将新值与旧值(在一条指令内)混淆是不可能的,因为新值在添加时尚不存在。没有其他顺序可以使新值在实际添加之前就存在。