考虑这两种方法:
我使用C:中的以下代码测试了这两种算法:
for(i=0; i<4; i++) {
}
并分析if
条件。
for(i=0; i<4; i++) {
if( i%2 ) {
}
else {
}
}
在这两种情况下,它们甚至(将以相同的次数预测正确/错误)。
是否有任何可能的简单算法,其中双峰更好比不采用?
答案 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。