【问题标题】:Is there any case where the Bimodal will be better than Not take?有没有双峰比不采取更好的情况?
【发布时间】:2018-09-22 00:01:32
【问题描述】:

考虑这两种方法:

  • 动态双峰:
    • 我们有 4 个阶段,每个阶段 2 个阶段(采取或未采取),每次算法预测错误时交替进行,在连续 2 次错误预测后从采取未采取变化。
  • 静态未采取:
    • 这里的算法将始终预测采用或未采用。在每个错误的预测之后在两个阶段之间切换。

我在 C 中使用以下代码测试了这两种算法:

for(i=0; i<4; i++) {

}

并分析if 条件。

for(i=0; i<4; i++) {
   if( i%2 ) {

   }
   else {
   }
}

在这两种情况下,它们都是偶数(预测正确/错误的次数相同)。
是否有任何可能的简单算法使双峰比不采用更好?

【问题讨论】:

  • 你称它为“Static Not Taken”,但描述听起来像是带有 1 位饱和计数器的动态预测。它是哪一个?此外,最好显示汇编(伪)代码。计数器的初始状态也很重要。当你说“我测试了这两种算法”时,你是怎么做到的?
  • 动态预测在错过分支时总是交替进行,static not taken 将始终预测未采取。还没有在程序集中,首先我需要找到一个代码,其中BImodal (Dynamic 2 bits) 会比Static not Taken 更好。我正在纸上测试它并计算双峰更好地预测何时分支和何时不分支的 porcetage%。我从Extreme/Strong not Taken开始
  • 好的,所以static not taken实际上是指未采用静态,因为您在问题中说“总是预测采用或未采用。在每个错误预测后在两个阶段之间交换。”那部分是令人困惑。
  • @HadiBrais 你是对的。对不起,伙计!

标签: cpu-architecture branch-prediction speculative-execution


【解决方案1】:

Static Not Taken (SNT) 预测器几乎总是(远)比任何其他预测器差。造成这种情况的主要原因是预测循环的控制流很糟糕,因为它会预测在每次迭代时都不会采取。

让我们假设第一个 C 循环将被编译成这样:

loop body
compute loop condition
branch to the loop body if condition met

所以最后只有一个分支。 SNT 预测器将预测未采用 4 次,但分支已采用 3 次。所以准确率是25%。另一方面,初始状态为 10 或 111 的双峰预测器将达到 75% 的准确度。初始状态 01 和 00 将分别达到 50% 和 25% 的准确度。 10 或 11 被认为是好的初始状态。

让我们假设第二个 C 循环将被编译成这样:

compute the if condition
branch to the else body if condition met
the if body
non-conditional branch to the end of the loop
the else body
compute loop condition
branch to the loop body if condition met

所以有两个条件分支。 SNT 预测器将预测 8 次未采取,但其中 5 次是错误预测(有 5 次采取和 3 次未采取2)。所以准确率是37%。对于双峰预测器,我们假设每个分支使用相同的计数器。初始状态为 10 或 11 的双峰预测器将达到 63% 的准确度。初始状态为 00 或 01 的双峰预测器将分别实现 25% 和 50% 的准确度。如果每个分支使用具有相同初始状态的不同计数器,则计算相似。


[1] 其中00和01代表未采取,10和11代表采取。

[2] T、T、NT、T、T、T、NT、NT。

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2021-08-10
    相关资源
    最近更新 更多