TAGE 预测精度随着在更大阵列上循环而提高?
TAGE prediction accuracy improves with loop over larger array?
代码片段遍历一维矩阵。 (N是矩阵的大小)。
for (i=0; i< N; i++) // outer loop for Rows
当我 运行 在处理器模拟器上使用这段代码来测量 TAGE 精度时,我意识到随着数组 (N) 大小的增加,TAGE 精度也会提高。
这是什么原因?
Loop b运行ches 通常只在最后一次迭代时预测错误,此时执行会跳出循环而不是跳到循环顶部。 (出于相当明显的原因:他们很快了解到 b运行ch 总是被选中,并以这种方式进行预测。)
您的循环迭代次数越多 运行,对于相同数量的错误预测的未采用特殊情况,您所采用的 b运行 的预测就越正确。
有趣的事实:在现代英特尔 CPUs(如 Haswell / Skylake)上,它们的 IT-TAGE branch predictors 可以“学习”最多约 22 次迭代的模式,正确预测循环退出。使用一个非常长的外循环来给 CPU 时间来学习模式,一个 运行 仅 22 次或更少迭代的内循环甚至倾向于预测循环出口 b运行ches正确。因此,如果循环体非常简单,当内循环大小超过该点时,性能(和指令吞吐量)会显着下降。
但是训练具有那么多历史的预测器可能需要相当多的外循环迭代。我正在测试 1000 万次左右的外循环迭代,以在 Linux 下的真实硬件上使用 perf stat
平均掉整个过程的噪声和启动开销。所以启动/学习阶段可以忽略不计。
使用较旧的更简单的 b运行ch 预测器(在 TAGE 之前),我认为一些 CPUs 确实使用计数器实现了循环模式预测,以预测 [=26] 的内部循环的循环退出=] 每次到达时迭代次数不变。 https://danluu.com/branch-prediction/ 同样说,“现代 CPUs”“经常”有这样的预测因素。
代码片段遍历一维矩阵。 (N是矩阵的大小)。
for (i=0; i< N; i++) // outer loop for Rows
当我 运行 在处理器模拟器上使用这段代码来测量 TAGE 精度时,我意识到随着数组 (N) 大小的增加,TAGE 精度也会提高。
这是什么原因?
Loop b运行ches 通常只在最后一次迭代时预测错误,此时执行会跳出循环而不是跳到循环顶部。 (出于相当明显的原因:他们很快了解到 b运行ch 总是被选中,并以这种方式进行预测。)
您的循环迭代次数越多 运行,对于相同数量的错误预测的未采用特殊情况,您所采用的 b运行 的预测就越正确。
有趣的事实:在现代英特尔 CPUs(如 Haswell / Skylake)上,它们的 IT-TAGE branch predictors 可以“学习”最多约 22 次迭代的模式,正确预测循环退出。使用一个非常长的外循环来给 CPU 时间来学习模式,一个 运行 仅 22 次或更少迭代的内循环甚至倾向于预测循环出口 b运行ches正确。因此,如果循环体非常简单,当内循环大小超过该点时,性能(和指令吞吐量)会显着下降。
但是训练具有那么多历史的预测器可能需要相当多的外循环迭代。我正在测试 1000 万次左右的外循环迭代,以在 Linux 下的真实硬件上使用 perf stat
平均掉整个过程的噪声和启动开销。所以启动/学习阶段可以忽略不计。
使用较旧的更简单的 b运行ch 预测器(在 TAGE 之前),我认为一些 CPUs 确实使用计数器实现了循环模式预测,以预测 [=26] 的内部循环的循环退出=] 每次到达时迭代次数不变。 https://danluu.com/branch-prediction/ 同样说,“现代 CPUs”“经常”有这样的预测因素。