我正在研究管道危险的例子,我正在查看following document
中的问题2
我发现this在某种程度上有所帮助。
据我了解,策略的工作方式如下:
我不确定我的理解是否正确。如果有人可以批评我的解决方案并告诉我,如果我的想法是正确的或解释我错在哪里,那将非常感激。
EDIT1:回答问题
1)你什么时候想知道什么时候你是对的(分支机构解决方案)?
我相信你会通过EX步骤知道分支分辨率。
2)你什么时候想知道什么时候你想要分支(对或错)?
我相信你会知道什么时候你想通过AG步骤进行分支。
3)你什么时候知道地址?
我相信你会知道AG步骤后的下一个地址。
EDIT2:“失速,直到一切都知道。”我的理解是,无论是否采用分支(有条件的或无条件的),管道将在AG阶段期间开始停止并且将继续停止直到EX阶段完成。含义:在所有情况下都必须停止4个循环。
它看起来如下: 我#= IF#,M#= MEM#,ST =停止
Branch: I1-I2-ID-AG-M1-M2-EX-WB
Successor: I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB
EDIT3:“假设没有采取”。我的理解是,顾名思义,您假设每个分支(有条件的或无条件的)都被采用。在这里发生的唯一失速将是采取分支的情况。摊位将发生在与之前相同的地方。因此,在这种情况下,在分支(有条件或无条件)发生的情况下,你会得到4个摊位,如果没有,则没有摊位。
它看起来像下面的
Branch: I1-I2-ID-AG-M1-M2-EX-WB
Taken: I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB
Not: I1-I2-ID-AG-M1-M2-EX-WB
EDIT4:“假设已经采取”。这基本上与之前的策略相反。在没有分支的情况下会有4个摊位,但在分支(有条件或无条件)发生的情况下没有。
它看起来像下面的
Branch: I1-I2-ID-AG-M1-M2-EX-WB
Not: I1-I2-ID-AG-M1-M2-EX-WB
Taken: I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB
答案 0 :(得分:1)
你知道它是Decode中的一个跳跃,你知道AGen中的跳跃目标,所以你可以比条件分支更早地解决跳跃。
我相信"假设没有采取"意味着你总是预测PC + 4。如果代码中没有采用分支,则管道不会出现任何气泡。如果你跳过跳跃或分支,那么你必须杀死错误的指令,并重定向PC。
我相信"假设拍摄"意味着一旦你意识到你正在接受一个分支并且有一个目标要跳转到,你就拿走分支(然后杀掉它背后假定的错误指定的指令)。这样可以节省AGen和Exe之间的周期。但是,如果不使用分支,则会出现性能不佳的情况,因为您需要将PC重定向回原来的状态。