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

时间:2015-06-04 00:58:50

标签: mips pipeline computer-architecture

在具有流水线和转发功能的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)

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

1 个答案:

答案 0 :(得分:0)

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

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

正如您所看到的那样,没有危险发生,因为SW指令在两个时钟周期后存储数据,因为ADD将结果放入$ t3。

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