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

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

add指令将在步骤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。
我认为在那种情况下不会发生危险:实际上,ADD指令是整数运算,在MIPS架构中仅需要一个时钟周期。
看这张图:

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

如您所见,由于结果由ADD放入$ t3,因此SW指令在两个时钟周期后存储数据,因此不会发生任何危险。

实际上,在类似情况下,也可能会发生危险,但前提是该单元是一个多周期单元(如果需要多个时钟周期来计算数据)。
请看以下示例,其中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无法在同一时钟周期内两次访问内存,因此会发生结构停顿。

关于mips - MIPS中是否存在执行存储数据危险?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30633283/

10-16 20:15