未采用静态 (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。