为什么尺寸功率为2的阵列较慢?为什么我获得-rdynamic性能?

时间:2014-11-01 22:37:00

标签: c++ arrays performance caching optimization

我在for循环中有一个简单的数组操作,它是针对数组的不同大小(从16到非常大)完成的,其中包含双精度数。我这样做了几次:

for(int i = 1; i < n-1; i++){
    target[i] = (source[i-1]+source[i]+source[i+1])*0.5;
}

我用“-O3 -march = native”编译它并测量速度。然后,由于这里不相关的原因,我尝试添加“-rdynamic”,以获得显着的加速,如图中所示。图例中的“cmake”是指“ - 动态”的补充。这仅适用于i7-4790 CPU。我根本无法在AMD Phenom II X6 1045T上重现它。

我当然不明白为什么-rdynamic会产生那么大的加速。 (GLOPS =每秒数十亿个数组单元的#updates)。为什么我加快了速度?为什么不在AMD CPU上?

请注意,这些测量值均为每种情况下十次测量的平均值。

另一个有趣的观察是,至少在开始时,由于阵列适合L1缓存,我有这些性能下降。有趣的是,那些发生在我的阵列的大小是2的幂。我想这与L2缓存有关,但我绝对不知道为什么和为什么。也许有些缓存冲突或对齐?

enter image description here

编辑: 我现在正确地绘制了:     g ++ -O3 -march = native programm.cpp -rdynamic 标有“cmake”的曲线与添加“-rdynamic”相同。

编辑2: 完全从问题中删除了cmake叙述。[彼得]

1 个答案:

答案 0 :(得分:1)

我不知道为什么rdynamic会导致加速。但关于第二个问题,请查看Agner Fog的指南“用C ++优化软件”http://www.agner.org/optimize/optimizing_cpp.pdf。看看第9.2节,他谈到了关键的步伐。可能适用于这种情况。