WAR 类 MIPS 流水线架构中的数据危害

WAR Data hazard in MIPS-like pipeline architecture

假设我们有以下指令集:

1: lw $f6, 20($gp)

2: lw $f2, 28($gp)

3: 多个 $f0, $f2, $f4

4: sw $f3, 32($gp)

我可以看到指令 1 和 4 之间存在 WAR 危险的可能性(对于 2 和 4 也是如此),但我不确定。

基本上我们从$gp+20读取并写入$f6,然后从$f3读取写入到$gp+ 32.当然,如果两个实例都处理 $gp+20,就会存在 WAR 数据危险,但由于最终受影响的地址不同($gp+20 与 $gp+32),我不确定如果仍然存在危险。我相信可能存在的原因是因为两条指令仍在尝试访问 $gp,并且只有在到达 $gp 之后才会添加任何常量以到达更新的地址。这是正确的吗?

谢谢

My reason for believing there may be is because both instructions are still trying to access $gp, and only after reaching for $gp is whatever constant added to reach the updated address. Would this be correct?

不,因为 $gp 在此代码序列中没有更改。


这些危险发生在处理器内部,它们与处理器执行寄存器读取和寄存器写入的微体系结构操作的顺序有关。由于流水线将指令分散到多个周期(由流水线阶段使用),因此寄存器的读取和寄存器的写入(对于不同的指令)可能会以某种重叠的方式发生。

这些危险与内存读写无关——只涉及寄存器读写。

A lw $s6, 20($gp) 有一个寄存器读取,$gp 和一个寄存器写入,$s6.

A sw $f3, 32($gp) 有两个寄存器读取,$gp$f3,没有寄存器写入。

WAR — 读后写 — 需要为后一条指令写入寄存器,为前一条指令读取寄存器。指令 1 和 4 不符合模式,因为指令 4 没有写入寄存器(是的,它写入内存并且有自己的顺序问题,但是 WAR 中的 W 指的是寄存器写入,sw不这样做)。