是否有任何情况下双峰会比没有更好?

时间:2018-04-12 00:39:48

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

考虑这两种方法:

  • 动态双峰:
    • 我们有4个阶段,每个阶段2个阶段(采取或不采取),每次算法预测错误时交替进行,在2次连续错误预测之后不进行采取< - >。
  • 静态未采取:
    • 此处算法将始终预测采取或不采取。在每次错误预测之后,在两个阶段之间进行交换。

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

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

}

并分析if条件。

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

   }
   else {
   }
}

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

1 个答案:

答案 0 :(得分:2)

静态未采用(SNT)预测器几乎总是(差)比任何其他预测器差。主要原因是它预测循环的控制流很糟糕,因为它预测不会在每次迭代时进行预测。

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

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

所以最后只有一个分支。 SNT预测器将预测未采取4次,但分支采取3次。所以准确率是25%。另一方面,初始状态为10或11 1 的双峰预测器将达到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个takens和3个not-takens 2 )。所以准确率是37%。对于双峰预测器,我们假设每个分支使用相同的计数器。初始状态为10或11的双峰预测器将达到63%的准确度。初始状态为00或01的双峰预测器将分别达到25%和50%的精度。如果每个分支使用具有相同初始状态的不同计数器,则计算类似。

[1]其中00和01表示未拍摄,10和11表示拍摄。

[2] T,T,NT,T,T,T,NT,NT。