0

我正在研究管道危害的示例,并正在查看以下文档中的问题 2

问题2

我发现有所帮助。

据我了解,这些策略的工作方式如下:

  1. 停止直到一切都知道:将停止直到到达 MEM2 阶段完成。据我了解,这是最简单的策略,所有 => 5、5、5 的停顿周期都是相同的。
  2. 假设未采用:将仅假设分支未采用。在这种情况下,当采用分支时,您将不得不停止 IF1 阶段之后的所有内容 => 7,0,7
  3. 假设:大致是#2的倒数;当不采用分支时,您将不得不停止 IF1 阶段 => 0,7,0

我不确定我的理解是否正确。如果有人可以批评我的解决方案并告诉我我的想法是否正确或解释我错在哪里,将不胜感激。

EDIT1:回答问题

1)你希望什么时候知道你是对的(分支决议)?

我相信您会通过 EX 步骤知道分支分辨率。

2) 你希望什么时候知道你想要什么时候选择分支(对还是错)?

我相信您会知道何时要按 AG 步骤进行分支。

3) 你什么时候知道地址?

我相信你会知道 AG 步骤之后的下一个地址。

EDIT2:“等到一切都知道为止。” 我的理解是,无论是否采用分支(有条件或无条件),管道将在 AG 阶段开始停止,并将继续停止直到 EX 阶段完成。含义:在所有情况下都必须停止 4 个周期。

它看起来如下所示:I# = IF#,M# = MEM#,ST = Stall

Branch:    I1-I2-ID-AG-M1-M2-EX-WB   
Successor:    I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB

EDIT3:“假设未采取”。我的理解是,顾名思义,您假设每个分支(有条件的或无条件的)都被采用。这里唯一会发生的停顿是分支被占用的情况。摊位将发生在与之前相同的地方。因此,在这种情况下,在分支(有条件或无条件)发生的情况下,您将获得 4 个停顿,而在没有出现分支的情况下,您将获得 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
4

1 回答 1

1

您知道这是 Decode 中的跳转,您知道 AGen 中的跳转目标,因此您可以比条件分支更早地解决跳转。

我相信“假设未采取”意味着您总是预测 PC+4。如果您的代码中没有采用分支,则您的管道不会出现气泡。如果您遇到跳转或分支,则必须终止错误推测的指令,并重定向 PC。

我相信“假设采取”意味着一旦你意识到你正在采取一个分支并且有一个要跳转的目标,你就会采取这个分支(并杀死它背后假设的错误推测指令)。这为您节省了 AGen 和 Exe 之间的循环。但是,如果未采用分支,则会出现不良行为,因为您需要将 PC 重定向回之前的状态。

于 2013-11-05T13:51:50.470 回答