C++ 为什么大小为2的阵列速度较慢?为什么我会获得-r动态性能?
我在for循环中有一个简单的数组操作,它是针对不同大小(从16到非常大)的数组执行的,该数组包含双精度。我多次这样做:C++ 为什么大小为2的阵列速度较慢?为什么我会获得-r动态性能?,c++,arrays,performance,caching,optimization,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; } for(int i=1;i
for(int i = 1; i < n-1; i++){
target[i] = (source[i-1]+source[i]+source[i+1])*0.5;
}
for(int i=1;i
我用“-O3-march=native”编译了它,并测量了速度。然后,出于与此无关的原因,我尝试添加“-rdynamic”,以获得显著的加速,如图中所示。图例中的“cmake”指的是“-rdynamic”添加项。这只适用于i7-4790 CPU。我根本无法在AMD Phenom II X6 1045T上复制它
我当然不明白为什么rdynamic会产生这么大的加速。(GLOPS=#以十亿为单位每秒更新阵列单元)。为什么我要加速?为什么不在AMD的CPU上呢
请注意,这些测量值是两种情况下各10个测量值的平均值
另一个有趣的观察结果是,至少在一开始,由于阵列适合一级缓存,我的性能下降了。有趣的是,当数组的大小是2的幂时,会发生这种情况。我想这和二级缓存有关,但我完全不知道是什么和为什么。可能是缓存冲突或对齐
编辑:
我现在正确地绘制了以下内容:
g++-O3-march=本机程序m.cpp-rdynamic
标记为“cmake”的曲线与添加“-rdynamic”相同
编辑2:
完全删除了问题中的cmake叙述。[Peter]我不知道为什么rdynamic会导致加速。但是关于第二个问题,请查看Agner Fog的指南“用C++优化软件”。请看第9.2节,他在其中谈到了关键步幅。可能适用于这种情况 这将是一个伟大的第一步,抽象出这个完全cmake。这只是一个构建系统。您已经确定它正在向GCC调用添加标志,所以为什么不关注它呢?但我做到了。我的重点是:“很明显,它更多地使用了just-rdynamic。我用包括-rdynamic在内的每手编译复制了相同的加速。”我只是用g++-O3-march=nativ program.cpp-rdynamic编译它。所以cmake并不直接在那里。