代码段遍历一个1D矩阵。(N为矩阵的大小)
for (i=0; i< N; i++) // outer loop for Rows
当我在处理器模拟器上运行这段代码来测量TAGE精度时,我意识到随着数组大小(N)的增加,TAGE精度也会增加。
这是什么原因?
循环分支通常只有在最后一次迭代时才会错误地预测执行超出循环而不是跳到顶部。(原因很明显:它们很快就知道该分支总是被占用,并预测到这一点。)
循环运行的迭代次数越多,对于相同数量的错误预测的未取特殊情况,您有更多正确预测的取分支。
有趣的事实:在现代英特尔cpu(如Haswell/Skylake)上,它们的IT-TAGE分支预测器可以"学习";多达22次迭代的模式,正确预测循环出口。使用非常长的外部循环来给CPU学习模式的时间,而只运行22次或更少迭代的内部循环往往甚至可以正确地预测循环退出分支。因此,如果循环体非常简单,那么当内循环的大小超过这一点时,性能(和指令吞吐量)就会显著下降。
但是它可能需要相当多的外循环迭代来训练具有这么多历史的预测器。我测试了大约1000万次外循环迭代,在Linux下的真实硬件上使用perf stat
来平均整个过程的噪声和启动开销。因此,启动/学习阶段可以忽略不计。
对于旧的更简单的分支预测器(在TAGE之前),我认为一些cpu确实实现了循环模式预测,并使用计数器来预测每次到达时运行恒定次数迭代的内部循环的循环退出。https://danluu.com/branch-prediction/也这么说,"现代cpu"often"有这样的预测。