【发布时间】:2015-08-18 10:35:51
【问题描述】:
关于具有流水线和转发的 MIPS 架构:
add $s0, $t1, $t2
sw $s0, 0($sp)
add 指令将在第 3 步(执行操作)准备好结果,但是我假设 sw 指令需要第 2 步的结果(指令解码和寄存器读取)。
David A. Patterson 的 Computer Organization and Design 一书中有一个已解决的练习:找出以下代码段中的危险并重新排序指令以避免任何管道停顿:
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)
在解决方案中,它正确识别负载使用风险并相应地重新排列代码,但是否也存在执行存储风险?
【问题讨论】:
-
加载使用风险来自加载需要两个周期,而其他简单指令(不包括,例如,乘法)只需要一个周期。一条简单指令的结果可以转发到下一条指令的执行阶段,因此即使是基地址寄存器值也没有危险(例如,
add $t2, $t2, 1; sw $t4, 0($t2))。对于存储,由于必须在实际写入存储数据之前完成地址生成、缓存索引和标签检查,因此可以容忍更长的延迟;在存储指令的写回阶段之前,甚至可能不需要存储数据。
标签: mips pipeline computer-architecture