我在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缓存有关,但我绝对不知道为什么和为什么。也许有些缓存冲突或对齐?
编辑: 我现在正确地绘制了: g ++ -O3 -march = native programm.cpp -rdynamic 标有“cmake”的曲线与添加“-rdynamic”相同。
编辑2: 完全从问题中删除了cmake叙述。[彼得]
答案 0 :(得分:1)
我不知道为什么rdynamic会导致加速。但关于第二个问题,请查看Agner Fog的指南“用C ++优化软件”http://www.agner.org/optimize/optimizing_cpp.pdf。看看第9.2节,他谈到了关键的步伐。可能适用于这种情况。