MIPS 中的数据危害(真正的依赖关系)
Data Hazard(True Dependencies) in MIPS
I1:LW R1, 0(R4) ; R1 ← address (0+R4)
I2:ADDI R2, R1, #8 ; R2 ← R1+8
I3:MULT R3, R1, R1 ; R3 ← R1*R1
I4:SW R3, 4(R2) ; address(4+R2) ← R3
在上面的 MIPS 代码中,在解决方案 sheet 中,R3 的真正依赖标记为 I3->I4。据我了解,真正的依赖关系是 RAW(写后读)危险或流危险。我很确定这是一个写后写的危险,因此不是真正的依赖。我这样说对吗?
write after write hazard
不,这不是写后写的危险。虽然 I4 看起来是一个写操作——相对于内存它确实是一个写操作——从微架构的角度来看,即在流水线级和寄存器所在和操作的处理器内部,存储指令有两个源操作数且无寄存器目标。
所以,R3被I3写入后被I4读取。 (换句话说,存储指令需要 R3 的值,作为执行内存存储的值;R3 的值连同存储地址和大小一起提供给数据存储器,这里为 4)。因此,这是写后读的危险。
I1:LW R1, 0(R4) ; R1 ← address (0+R4)
I2:ADDI R2, R1, #8 ; R2 ← R1+8
I3:MULT R3, R1, R1 ; R3 ← R1*R1
I4:SW R3, 4(R2) ; address(4+R2) ← R3
在上面的 MIPS 代码中,在解决方案 sheet 中,R3 的真正依赖标记为 I3->I4。据我了解,真正的依赖关系是 RAW(写后读)危险或流危险。我很确定这是一个写后写的危险,因此不是真正的依赖。我这样说对吗?
write after write hazard
不,这不是写后写的危险。虽然 I4 看起来是一个写操作——相对于内存它确实是一个写操作——从微架构的角度来看,即在流水线级和寄存器所在和操作的处理器内部,存储指令有两个源操作数且无寄存器目标。
所以,R3被I3写入后被I4读取。 (换句话说,存储指令需要 R3 的值,作为执行内存存储的值;R3 的值连同存储地址和大小一起提供给数据存储器,这里为 4)。因此,这是写后读的危险。