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