【问题标题】:Nop and Pipeline Hazards in this Assembly MIPS此装配 MIPS 中的 Nop 和管道危险
【发布时间】:2014-01-04 17:48:25
【问题描述】:

通过 Cross Compiler 将 C 编译为汇编 MIPS 后,我有:

main:
.frame $fp,32,$31 # vars= 16, regs= 1/0, args= 0, gp= 8

addiu $sp,$sp,-32
sw $fp,24($sp)
move $fp,$sp
li $2,5 # 0x5
sw $2,8($fp)
lw $2,8($fp)
nop
sw $2,16($fp)
li $2,5 # 0x5
lw $3,16($fp)
nop
beq $3,$2,$L4
nop

li $2,10 # 0xa
lw $3,16($fp)
nop
beq $3,$2,$L5
nop

li $2,1 # 0x1
lw $3,16($fp)
nop
beq $3,$2,$L3
nop

b $L7
nop

$L3:
lw $2,8($fp)
nop
addiu $2,$2,3
sw $2,8($fp)
b $L7
nop

$L4:
lw $2,8($fp)
nop
sll $2,$2,3
sw $2,8($fp)
b $L7
nop

$L5:
lw $2,8($fp)
nop
srl $2,$2,2
sw $2,8($fp)
$L7:
move $sp,$fp
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop

.end main

我不明白为什么有很多nop代码行,这段代码中nop是什么意思?它对Pipeline Hazards 有什么帮助吗?如果我删除所有的 nops 怎么办?

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    NOPs 因管道危险而被插入。

    回想一下,MIPS 管道由 5 个阶段组成:Fetch、Decode、eXecute、Memory、Write-back。

    让我们来看看NOPs。第一个是:

    lw $2,8($fp)
    nop
    sw $2,16($fp)
    

    此代码假定没有 Memory-Memory 转发。为什么?因为如果你画一个时间线流水线图,你会看到NOP 迫使sw 的内存阶段恰好在lw 上的回写阶段后一个周期发生。因此,代码假定处理器具有内存 -> ALU 转发,或回写 -> 内存转发。如果我们没有在两者之间使用NOPsw 的内存阶段将从$2 读取一些垃圾值(无论来自解码阶段的内容),并且行为将是未定义的。

    第二个nop

    lw $3,16($fp)
    nop
    beq $3,$2,$L4
    

    这里,$3 仅在 lw 的内存阶段完成后可用。如果我们没有NOP,那么beq eXecute 阶段将与lw 的Memory 阶段在同一个循环中发生,即使使用Memory -> ALU 转发也是不可能的。因此,我们必须将beq 延迟一个周期,这就是NOP 正在做的事情。有了这个NOPbeq 的执行阶段将在lw 的内存后一个周期发生。这可行,假设有内存 -> ALU 转发。

    类似的原因也适用于其他情况,我建议您尝试自己弄清楚。

    【讨论】:

    • 我认为第一个 (lw...nop...sw) 确实有内存转发,如果没有,会有 2 条 nop 行 (...nop...nop...) 以避免危险.
    • @VAK 有Memory->ALU 转发或Write-back->Memory 转发,但没有Memory->Memory。如果有 Memory->Memory,我们就不需要 NOP。有了这个 NOP,我们将sw 的解码与lw 的内存在同一周期发生(因此,可能存在从内存-> ALU 的转发,丢弃从解码读取的垃圾);它还将sw 的内存与lw 的回写放在同一个循环中,因此我们也可以进行回写->内存转发。但是我们当然没有 Memory->Memory,或者如果我们有,编译器是不知道的。
    【解决方案2】:

    根据您的代码,添加了所有“nop”指令以修复以下错误

    1) 分支延迟

    2) 加载延迟

    由于这些 nop 是由编译器添加的,因此您可以明确地为编译器提供一个选项,以不通过“set noreorder”添加这些 nop 指令,我应该给您参考 read 。 “参见 Mips Run 第 2 版”页码。 288. 我不认为“nop”是危险屏障。就像这本书一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多