提问人:Nick 提问时间:6/4/2015 更新时间:1/27/2017 访问量:2337
MIPS 中是否存在执行存储数据风险?
Is there an execute-store data hazard in MIPS?
问:
在具有流水线和转发功能的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)
在解决方案中,它正确地识别了负载使用危险并相应地重新排列了代码,但是否也存在执行存储危险?
答:
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
因此,对于您的第二个示例,解决方案是在它们之间放置一些不使用这些寄存器的其他指令?
上一个:打印文件的前 N 个字
下一个:如何避免枚举值的冲突?
评论
add $t2, $t2, 1; sw $t4, 0($t2)