0

考虑这两种方法:

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

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

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

}

并分析if条件。

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

   }
   else {
   }
}

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

4

1 回答 1

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


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

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

于 2018-04-12T17:59:17.847 回答