在6级标量或超标量MIPS中,由于误预测需要杀死多少条指令?

问题描述 投票:2回答:1

我正在使用6个阶段的流水线:F D I X0 X1W。当发生分支未命中预测时,我被问到需要杀死多少条指令。

我想出了4。我想这是因为分支解析发生在X1中,我们将需要杀死分支之后的所有指令。在管道图中,看起来需要杀死流经管道的4条指令。那是对的吗?

我还被问到,如果管道是三宽超标量,则需要杀死多少人。我不确定这一点。我认为应该是12,因为您一次可以提取3条指令。正确吗?

mips pipeline cpu-architecture mips32 branch-prediction
1个回答
0
投票

杀死分支之后的所有说明

如果不是真正的MIPS,则不是。 MIPS有一个branch-delay slot:分支之后的指令始终执行,无论是否采用分支。 (jal的返回地址是延迟槽的末尾,因此它不会执行两次。)

这足以完全隐藏使用标量classic RISC 5-stage pipeline的经典MIPS I(R2000)上的分支等待时间的1个周期。它通过forwarding from the first half of an EX clock cycle to an IF starting in the 2nd half of a clock cycle来管理1个周期的分支等待时间。这就是为什么MIPS分支条件都“简单”(不需要在整个字中进行进位传播)的原因,例如两个寄存器之间的beq,而对于隐式bgez仅使用一个操作数bltz / 0签署了2的补码比较。只需检查符号位即可。

如果您的管道设计合理,您将期望它在X0之后解析分支,因为MIPS ISA已经受到限制,可以使ALU轻松进行低延迟分支决策。但是显然,您的管道没有经过优化,并且直到X1结束时分支决策才准备就绪,这违背了使它运行MIPS代码而不是RISC-V或任何其他RISC指令集的目的。


我想出了4。我想这是因为分支解析发生在X1中,我们将需要杀死分支之后的所有指令。

我认为对于普通的标量流水线,[4个周期看起来很正确分支延迟时隙。

在该X1周期结束时,前四个流水线阶段的每个阶段都有一条指令,等待在该时钟沿移至下一个阶段。 (假设没有其他管道气泡)。延迟时隙指令就是其中之一,不需要取消。

((除非存在I-cache丢失获取延迟槽指令的情况,否则延迟槽指令可能甚至还没有在流水线中。因此,这不像杀死X0之前的3个阶段,甚至杀死所有阶段一样简单。但最旧的指令在管道中。延迟槽不是免费实现的,这也使异常处理变得复杂。)

因此,需要在从F到I的流水线阶段中终止0..3指令。(如果延迟时隙指令可能处于那些阶段之一,则必须检测到这种特殊情况。 t,例如I-cache未命中等待时间足够长,以至于它处于X0或仍在等待获取,那么管道就可以杀死前三个阶段,并根据X0是否为气泡来做某事。)


我认为应该是12,因为您一次可以获取3条指令

没有记住分支本身是可以通过管道的3条指令之一。在“未采用”的情况下,大概是解码阶段将通过管道将那个获取/解码组中的所有3条指令发送了下来。]

[最坏的情况是我认为当分支是组中的第一条(按程序顺序最旧)指令时。然后,必须杀死X1中该组中的1条(或2条没有分支延迟槽的指令)以及先前阶段中的所有指令。然后(假设没有气泡),您要取消13(或14)条指令,在每个先前阶段中要取消3。

[最好的情况是当分支在3个组中最后一个(按程序顺序排列时是最新的)。那么您将丢弃11个(或12个没有延迟槽的)。

因此,对于没有延迟槽的该管道的3宽版本,取决于先前管道阶段中的气泡,您将杀死管道中已经存在的0..14指令。

实施延迟时隙很糟糕;有一个原因是较新的ISA不公开该管道详细信息。长期痛苦会带来短期收益。

© www.soinside.com 2019 - 2024. All rights reserved.