【问题标题】:Pipeline hazard handling管道危险处理
【发布时间】:2026-02-15 19:35:01
【问题描述】:
I0: slli  $s2, $s1, 4
I1: beq   $s1, $zero, top
I2: addi  $s3, $s2, 6
I3: mult  $t2, $s3, $s1
I4: addi  $s4, $s2, 8
I5: sw    $t2, 0($s4)

考虑没有任何危险处理的管道。流水线是典型的 5 级 IF、ID、EX、MEM、WB MIPS 设计。对于上面的代码,完成代码的管道。为框中的每条指令插入字符 IF(指令获取)、ID(指令解码)、EX(执行)、M(内存)、WB(回写)。大家觉得我的图对吗? 谢谢!http://imgur.com/PbJ2egd

【问题讨论】:

    标签: pipeline


    【解决方案1】:

    首先让我们画出哪些指令依赖于前面指令的哪些输出

    • I0:这里不依赖任何东西
    • I1:这里什么都不依赖,只是一个分支
    • I2:依赖于 I0 ($s2)
    • I3:依赖于 I2 ($s3)
    • I4:依赖于 I0 ($s2)
    • I5:依赖于 I4 ($s4)

    因此,当一条指令依赖于另一条指令时,例如 I5 依赖于 I4,其 EX 块无法运行,直到它所依赖的指令完成其 WB 块。在 I5 的情况下,我们可以清楚地看到这一点,因为 EX 块只有在 I4 的 WB 块完成后开始

    还要注意,分支会阻止下一条指令在其 EX 块完成之前启动。

    通过这两条规则,我们可以逐条指令并绘制出来:

    • I0:不依赖任何输出。
    • I1:不依赖输出,但请注意它是一个分支。直到 EX 完成,下一条指令才能开始。
    • I2:依赖于 I0 的输出,所以等待 I0 的 WB,还要等待 I1 的 EX,因为 I1 是一个分支。 I1的EX是最坏的情况,所以等到那时。这会拖延 2 个街区。
    • I3:依赖于 I2 的输出,所以等待 I2 的 WB。这会停止 2 个街区。 (我们现在总共停止了 4 个)
    • I4:依赖 I0 的输出,所以等待 I0 的 WB。这会暂停 0 个块,因为 I0 早已完成。 (我们现在总共停止了 4 个)
    • I5:依赖于 I4 的输出,所以等待 I4 的 WB。这会停止 2 个街区。 (我们现在总共停止了 6 个)

    所以最后我们停了 3 次,每次停两个街区。这等于你老师画的 6 个“x”。

    【讨论】:

      【解决方案2】:

      这是她昨天复习时给我们的正确答案。你能指出我如何回答这个问题的正确方向吗?你怎么知道什么时候延迟,放X等?很抱歉我不能给出答案的确切细节,但我知道这是正确的答案。

      【讨论】: