与 BNE 执行和标签指令获取相关的流水线停顿

Pipeline Stall Related to BNE Execution and Label Instruction Fetch

以下是与管道问题相关的解决方案。

看完解决方案,我有一个问题。

为什么第一行bne , [=10=], L1 EX与最后一行L1:sw , 0()IF处于同一周期?据我了解,在最后一行取指令之前,它应该等到 bne 完成条件执行并知道是否需要取指令。

任何提示表示赞赏。非常感谢您的时间和帮助。

根据https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Control_hazards经典MIPS在ID阶段解析分支,分支延迟槽完全隐藏了前端气泡。 (假设编译器可以用 NOP 以外的东西填充它)。


即使那不是真的并且分支确实需要等待 EX 被解析,CPU 可以推测性地获取和解码后面的指令; none 它们在检测到正确的分支方向之前到达 MEM 或 WB,因此它们对架构状态没有永久影响。 (实际上 none 其中甚至达到了 EX,所以根本没有推测执行,只是推测解码)。

如果 EX 检测到应该采用分支,则管道将不得不重新开始获取 sw 指令,而管道中没有 jr。 (add 保留因为它在分支延迟槽中:它在两种情况下都被执行。)

进一步阅读:difference between speculation and prediction, and also this unclearly-worded question 。 Hadi 的精彩回答涵盖了 CPU 在他们确定分支走向之前可以做的一系列事情。

根据分支预测简单地获取和解码指令,但不执行它们,是一种更简单的方法,许多人根本不认为它是推测性的 执行。仍然推测需要流水线刷新/重新引导,这与在确定正确的提取地址之前停止不同。 (如果没有分支延迟槽,您甚至无法检测到分支(在解码中),直到您已经从可能错误的路径中获取指令。在更深/更宽的管道中,分支预测对于预测下一个获取块很重要地址甚至在解码已经弄清楚当前块中是否有任何分支之前的地址。这与特定分支指令去向的详细预测是分开的。)


这张图的奇怪之处在于,它显示 jrsw 在同一周期的同一阶段 。这没有任何意义,sw 甚至在 fetch 到达之前都无法停止。

这是分支案例吗?那也没有意义,因为 jr 根本不应该在管道中。并且 sw 不能在 add 处于获取阶段的同一周期中停止。