Optimization 为什么高百分比的相同输入数据会降低性能?

Optimization 为什么高百分比的相同输入数据会降低性能?,optimization,micro-optimization,branch-prediction,Optimization,Micro Optimization,Branch Prediction,我有一些代码,我一直在工作,为了优化它,我一直试图通过测试不同类型的输入数据如何影响其性能来理解编译器的优化过程。我的代码的简化版本如下 function foo(Pair[] pairsData) { for (Pair p : pairsData) { res.append(bar(p)) } } function bar(Pair p) { double minDistance = Double.MAX_VALUE; double bes

我有一些代码,我一直在工作,为了优化它,我一直试图通过测试不同类型的输入数据如何影响其性能来理解编译器的优化过程。我的代码的简化版本如下

function foo(Pair[] pairsData) {
   for (Pair p : pairsData) {
      res.append(bar(p))
   }
}
    

function bar(Pair p) {
    double minDistance = Double.MAX_VALUE;
    double bestI = -1;
    for (int i = 0; i < 4; i++) {
        double d = p.x - p.y - i;
        if (d < minDistance) {
            minDistance = d;
            bestI = i;
        }
    }
    return bestI;
}
函数foo(对[]对数据){
用于(对p:pairsData){
附加资源(bar(p))
}
}
功能条(p对){
double minDistance=double.MAX_值;
双最佳指数=-1;
对于(int i=0;i<4;i++){
双d=p.x-p.y-i;
if(d
我预计,如果pairsData中的所有对都相同,那么这将显著提高性能,因为编译器的分支预测器可以实现完美的成功率,因此不会出现分支预测失误,从而提高性能。但我发现,特别是对于少量数据(50-100对),增加相同数据点百分比的效果可以忽略不计。我曾考虑过这可能是因为分支预测器无法使用如此少的数据进行优化,或者是因为没有足够的成本(仅两次更新)使分支预测失误仅在几次迭代中产生重大影响


但是,对于非常大的数据量(大约100000对),性能似乎会先提高,然后恶化(当有50%的相同对时达到峰值)。既然相同对的百分比越高,分支预测失误就越少,MindDistance必须更新的次数就越少,这怎么可能呢?

什么编译器?这是什么语言?您编译的是什么CPU/ISA?如何生成输入数据?在不相同的对中是否有某种模式可以让分支预测仍然有效?有些配对会多次运行
if
body,因此如果预测良好,吞吐量也可能取决于
d
仅在第一次为真。(或者如果其中一个double是
NaN
)顺便说一句,这将使用无分支SIMD进行合理优化:将
p.x-p.y
广播到AVX向量的所有4个元素,然后减去
[0,1,2,3]
向量。洗牌和2x
\u mm256\u min\u pd
以获得每个元素=水平min的向量。然后
\u mm256\u cmp\u pd(v,min,\u cmp\u EQ\u OQ)
\u mm256\u movemask\u pd
以获得元素等于min的位图,和
\uuuu builtin\u ctz
对第一个匹配的位置进行位扫描。@PeterCordes该语言是使用javac编译器的Java语言,输入数据由随机生成的点组成,其中一个点(随机选择)被复制,因此它填充了0%、25%、50%、75%以及最后100%的数据(每个数据分别进行基准测试)@PeterCordes我修改了代码,以确保d