我在理解管道危害(尤其是数据危害以及如何使用停顿周期和数据转发来解决这些危害方面遇到一些困难)。这是带有数据和负载使用危险(指出)的MIPS汇编代码示例:]
B0: sll $t2, $a0, 2 B1: add $t1, $a0, $a1 B2: lw $t0, 4($t1) #data hazard $t1 B3: slt $v0, $t1, $a1 #data hazard $t1 B4: sub $v1, $v0, $t3 #data hazard $v0 B5: addi $t0, $t0, 4 B6: lw $t1,8($t0) #data hazard $t0 B7: sll $t1, $a1, 1 B8: add $t2, $t1, $v0 #data hazard $t1 B9: lw $v0, 0($t2) #data hazard $t2 B10: lw $t3, 0($v0) #load-use hazard $v0 B11: and $v0, $t3, $a2 #data hazard $t3 B12: sll $a1, $t3, 1 #data hazard $t3
对于此代码,我们获得了一个管道“图表”,我们必须在其中填写停顿周期和数据转发。由于该图具有
20
个周期,因此我将仅显示前5
个周期,并且在这些5
个周期中转发数据。Pipeline Cycle - First 5 cycles with data forwarding.
在图中,您可以看到我们从BO
从EX
转发到EX
中的B1
,但是为什么呢?由于我们不需要B0
或B1
中来自B2
的两个寄存器中的任何一个,因此没有关于$t2
或$a0
的数据危险,因此不需要数据转发。
另外,我如何知道是否必须从EX
或MEM
转发,因为有时我不确定是否必须从EX
到EX
,从EX
到[C0 ],MEM
至MEM
或EX
至MEM
。我想对此进行澄清。
我在理解管道危害(尤其是数据危害以及如何使用停顿周期和数据转发来解决这些危害方面遇到一些困难)。这是一个MIPS的示例...
这些流水线危害的性质是,管道是否会尝试使用过时的值。流水线式将单个指令的执行分散到各个阶段(每个阶段在随后的周期中发生),从而使每个阶段的周期时间更短。为了不影响性能,流水线处理器会覆盖连续指令的执行。正是这种重叠既提高了性能,又带来了潜在的危害。