流水线在加载指令后停止,但在添加指令后不停止

Pipeline stall after a load instruction but not after an add instruction

我正在做一些关于管道的问题。这个我需要帮助。

Why can there be a pipeline stall after a load instruction but not after an add instruction?

我知道管道中未使用的槽称为管道停顿。我的猜测是它可能是加载指令后的流水线停顿,因为我们需要等待可能更新的寄存器。但是我想不出为什么 add 指令不能创建流水线停顿的答案。也许是因为在这个阶段我们已经从寄存器中读取了?

管道停顿用于解决通常由数据依赖性引起的危害。 add 实际上会产生流水线停顿,但让我们首先考虑一个它不会的例子。

SUB r2, r3
ADD r1, r2

即使加法指令使用减法的结果,也没有停止。这是因为EX阶段可以访问前一个EX阶段的数据。

现在让我们考虑一个 add 可以产生停顿的例子。

LOAD r2, RAM[a]
ADD r1, r2

这里,加载指令的MEM阶段产生的数据需要作为ADD指令的EX阶段的输入。 EX 阶段只能访问前一个 EX 阶段的数据,因此由于写后读取危险而导致管道停顿。这张图说明了这一点

这是通过在管道中引入气泡(如 NOP)来解决的,它解决了数据依赖性,而无需及时向后传播数据(这是不可能的)。

您可以通过阅读 hazards, bubbles, and forwarding

来更详细地了解更多信息