MIPS 中是否存在执行存储数据风险?

Is there an execute-store data hazard in MIPS?

提问人:Nick 提问时间:6/4/2015 更新时间:1/27/2017 访问量:2337

问:

在具有流水线和转发功能的MIPS架构上:

add $s0, $t1, $t2
sw $s0, 0($sp)

添加指令将在步骤 3(执行操作)准备好结果,但我假设 sw 指令希望在步骤 2(指令解码和寄存器读取)获得结果。

David A. Patterson 所著的《计算机组织与设计》一书中有一个已解决的练习:在以下代码段中找到危险并重新排序指令以避免任何管道停滞

lw  $t1, 0($t0)
lw  $t2, 4($t0)
add $t3, $t1,$t2
sw  $t3, 12($t0)
lw  $t4, 8($01)
add $t5, $t1,$t4
sw  $t5, 16($t0)

溶液:

lw  $t1, 0($t0)
lw  $t2, 4($t1)
lw  $t4, 8($01)
add $t3, $t1,$t2
sw  $t3, 12($t0)
add $t5, $t1,$t4
sw  $t5, 16($t0)

在解决方案中,它正确地识别了负载使用危险并相应地重新排列了代码,但是否也存在执行存储危险?

MIPS 流水线 CPU 架构

评论

3赞 6/4/2015
负载使用危险来自负载需要两个周期,而其他简单指令(不包括,例如乘法)只需要一个周期。简单指令的结果可以转发到下一条指令的执行阶段,因此即使对于基址寄存器值也没有危险(例如,)。对于存储,由于必须在实际写入存储数据之前完成地址生成、缓存索引和标记检查,因此可以容忍更长的延迟;在存储指令的写回阶段之前,甚至可能不需要存储数据。add $t2, $t2, 1; sw $t4, 0($t2)

答:

0赞 Mo_loch 1/27/2017 #1

让我们考虑一个激活转发的 MIPS。 我认为在这种情况下不会发生危险:实际上,ADD指令是一个整数操作,在MIPS架构中只需要一个时钟周期。 请看这张图:

ADD $t3,$t1,$t2    IF   ID   EX   MEM   WB
SW  $t3,12($t0)         IF   ID   EX    MEM  WB

如您所见,不会发生任何危险,因为 SW 指令在两个时钟周期后存储基准,因为结果由 ADD 放入 $t 3 中。

实际上,在类似情况下,可能会发生危险,但前提是设备是多周期设备(如果它需要多个时钟周期来计算数据)。 请看这个例子,其中 ADD.D 指令使用浮点加法器,需要 4 个时钟周期来执行计算:

ADD.D F2,F4,F5      IF   ID   A0   A1   A2   A3   MEM   WB
S.D   F2,somewhere       IF   ID   EX   X0   X1   X2    MEM    WB

X0 和 X1 是 RAW 失速,而 X2 是结构失速:在前一种情况下,S.D 必须等待 ADD。D 完成;在后者中,MIPS无法在同一时钟周期内两次访问存储器,因此会出现结构性停滞。

评论

0赞 puppydrum64 12/14/2022
因此,对于您的第二个示例,解决方案是在它们之间放置一些不使用这些寄存器的其他指令?