考虑以下两种方法:
- 动态双峰: 我们有 4 个阶段,
- 每个阶段 2 个阶段(采取或不采取),并且每次算法预测错误时交替进行,在连续 2 次错误预测后从采取<->不采取改变。
- 静态未采取:
- 在这里,算法将始终预测采取或不采取。在每次错误的预测后在两个阶段之间切换。
我用 C 语言中的以下代码测试了这两种算法:
for(i=0; i<4; i++) {
}
并分析if
条件。
for(i=0; i<4; i++) {
if( i%2 ) {
}
else {
}
}
在这两种情况下,它们都是偶数(将预测正确/错误的次数相同)。
有没有可能的简单算法,双峰总比不采取更好?
静态未采取 (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.