在MIPS中使用NOP和停顿有什么区别

时间:2015-10-12 01:26:18

标签: mips32

使用NOP而不是停顿有什么不同。 在流水线操作的情况下,两者都碰巧执行相同的任务。我不明白

2 个答案:

答案 0 :(得分:10)

我认为你的术语很混乱。

处理器将一个停顿注入到管道中以解决数据危险(处理指令所需的数据尚不可用的情况。NOP只是没有副作用的指令。

失速

回想5管道阶段classic RISC pipeline

  1. IF - 取指令(从存储器中取出下一条指令)
  2. ID - 指令解码(找出这是什么指令以及操作数是什么)
  3. EX - 执行(执行操作)
  4. MEM - 内存访问(存储或从内存中读取)
  5. WB - 回写(将结果写回寄存器)
  6. 考虑代码段:

    add $t0, $t1, $t1
    sub $t2, $t0, $t0
    

    从这里可以看出,第二条指令依赖于第一条指令的结果。这是data hazard:写后读(RAW); 真依赖

    sub在EX阶段需要add的值,但add仅处于MEM阶段 - 在WB阶段之前,该值将无法使用:

    +------------------------------+----+----+----+-----+----+---+---+---+---+
    |                              |         CPU Cycles                      |
    +------------------------------+----+----+----+-----+----+---+---+---+---+
    |         Instruction          | 1  | 2  | 3  | 4   | 5  | 6 | 7 | 8 | 9 |
    +------------------------------------------------------------------------+
    |       0 | add $t0, $t1, $t1  | IF | ID | EX | MEM | WB |   |   |   |   |
    |       1 | sub $t2, $t0, $t0  |    | IF | ID | EX  |    |   |   |   |   |
    +---------+--------------------+----+----+----+-----+----+---+---+---+---+
    

    One solution这个问题是处理器在数据可用之前插入档位或冒泡管道。

    +------------------------------+----+----+----+-----+----+----+-----+---+----+
    |                              |         CPU Cycles                          |
    +------------------------------+----+----+----+-----+----+----+-----+----+---+
    |         Instruction          | 1  | 2  | 3  | 4   | 5  | 6  | 7   | 8  | 9 |
    +----------------------------------------------------------------------------+
    |        0 | add $t0, $t1, $t1 | IF | ID | EX | MEM | WB |    |     |    |   |
    |        1 | sub $t2, $t0, $t0 |    | IF | ID | S   | S  | EX | MEM | WB |   |
    +----------+-------------------+----+----+----+-----+----+---+---+---+-------+
    

    NOPs

    NOP是无效的指令(没有副作用)。 MIPS汇编程序通常在MIPS this is equivalent to nop中支持sll $zero $zero 0指令。

    该指令将占用管道的所有5个阶段。它最常用于填充跳跃或分支的branch delay slot,当没有其他任何有用的东西可以在那个插槽中完成时。

    j label
    nop # nothing useful to put here
    

    如果您使用的是MIPS模拟器,则可能需要启用分支延迟时隙模拟才能看到此情况。 (例如,在spim中使用-delayed_branches参数)

答案 1 :(得分:0)

我们不应使用NOP代替摊位,反之亦然。

当存在导致危险的依赖关系时,我们将使用停顿,这会导致流水线的特定阶段等待直到获取所需的数据,而在发生停顿的情况下使用NOP,它将仅通过指令的这一阶段而不会做任何事情。但是,通过使用NOP在该阶段完成之后,该阶段所需的数据就可用了,我们需要从头开始执行指令,这将增加处理器的平均CPI,从而导致性能下降。另外,在某些情况下,该指令所需的数据可能会在重新启动指令之前被另一条指令修改,这将导致执行错误。

同样,如果我们使用档位代替NOP,则采用相同的方式。 每当在执行阶段发生不可屏蔽的中断(如被零除)时,我们都需要在异常之后通过这些阶段,而不更改处理器的状态,这里我们使用NOP来传递流水线的其余阶段,而无需进行任何更改处理器状态(例如,将某些内容写入寄存器或内存中,这是为异常生成的错误值)。

在这里,我们不能使用停顿,因为下一条指令将等待停顿完成,并且停顿将不会完成,因为这是不可屏蔽的中断(用户无法控制这些类型的指令)和管道进入僵局。