【问题标题】:States of a 2-bit Branch Predictor2 位分支预测器的状态
【发布时间】:2020-04-04 16:53:54
【问题描述】:

我正在阅读 Patterson 和 Hennessy 所著的《计算机组织与设计:硬件/软件接口第 5 版》第 5 章中的动态分支预测部分时,我遇到了下图显示 2 位预测器的状态:

2 位预测器在两次预测错误后应该改变它的预测。但是根据这个图,当我们从左下状态开始时,如果机器在分支应该是“TAKEN”的时候预测“NOT TAKEN”两次,那么就达到了右上角的PREDICT TAKEN状态。然而,这里机器会改变状态到右下角PREDICT NOT TAKEN,即使它错误地预测了分支应该只被“NOT TAKEN”一次。

这不是错误的行为吗?这是否意味着状态机错误或我遗漏了什么?

当分支被 TAKEN 两次时,在底部 NOT TAKEN 深色状态,您可以看到达到的状态是浅色“不确定”状态,而根据我的说法,它应该是深色“确定”状态,因为该分支连续两次执行相同的操作。

【问题讨论】:

  • 你认为什么行为是错误的?浅色状态表示 CPU“不确定”是否应该采用分支。在那种情况下,一个错误的预测就足以让它“改变主意”。当它处于深色状态时,它对分支更加“确定”,因此需要连续两次错误预测才能让它改变预测。显然,很容易找到病态的例子(例如,如果您从浅色状态开始并且具有交替模式,采取-未采取-采取-未采取-...,您可能会失败 100% 次)。
  • 在底部 NOT TAKEN 深色状态下,当分支被 TAKEN 两次时,您可以看到达到的状态是浅色“不确定”状态,而根据我的说法,它应该是深色“确定”状态,因为分支连续两次执行相同的操作。

标签: cpu-architecture branch-prediction


【解决方案1】:

当分支被 TAKEN 两次时,在底部 NOT TAKEN 深色状态,您可以看到达到的状态是浅色“不确定”状态,而根据我的说法,它应该是深色“确定”状态,因为该分支连续两次执行相同的操作。

在两个连续的分支之后,浅蓝色状态会像您希望的那样预测。如果从那时起分支,则不会有进一步的错误预测。我不认为你的“应该”是合理的。

这是一个 2 位饱和计数器;从 00 到 11 需要 3 个步骤,对应于该图的 3 个步骤。

您的想法可以使用 2 位状态来实现,以记录最后 2 个分支中的每个分支的走向。但是您如何区分未采用的循环分支一次(退出前一个循环)和/或再次被采用一次(下一个循环的第一个迭代)与一个很少采用的分支被采用一次?如图所示,实际的方法是在每个循环中错误地预测循环分支一次,仅在最后一次迭代失败时。下一次进入循环的第一次迭代预测正确,将其返回到强采用。


您可以在 Raffzahn 对 retrocomputing.SE 上How does the 68060 branch predictor work? 的回答中找到此类预测器的详细示例,包括当您遇到 BPB 未命中时的静态预测(向后采用,向前未采用)(此分支没有预测条目)。

2 位预测器非常远非完美;更高级的预测器还考虑全局历史是否比本地更好地预测该分支。 https://danluu.com/branch-prediction/

【讨论】:

  • 在两个连续的分支之后,浅蓝色状态会像您希望的那样预测。如果从那时起执行分支,就不会再出现错误预测了。 - 是的,但是如果在处理器处于浅蓝色状态时没有执行一次分支会发生什么?根据图表,它立即进入浅灰色状态并开始预测 NOT TAKEN,这不应该是 2 位预测器应该做的。
  • @RijulGanguly:是的,无论您喜欢与否,这 2 位预测器会做什么。为什么您认为不这样做会更好,或者您的“应该”声明有任何其他原因?
  • 我意识到我在哪里犯了错误。在计算错误的 NOT TAKEN 预测时,我没有计算第二个错误的 TAKEN 预测。在我看来,状态系统似乎在仅仅一次错误的 TAKEN 预测之后改变了它的预测。谢谢你:)
猜你喜欢
  • 2017-07-09
  • 1970-01-01
  • 2014-04-25
  • 2014-03-03
  • 2013-09-04
  • 2016-05-16
  • 2016-07-01
  • 2011-02-01
  • 2015-11-24
相关资源
最近更新 更多