Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么大小为2的阵列速度较慢?为什么我会获得-r动态性能?_C++_Arrays_Performance_Caching_Optimization - Fatal编程技术网

C++ 为什么大小为2的阵列速度较慢?为什么我会获得-r动态性能?

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循环中有一个简单的数组操作,它是针对不同大小(从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
我用“-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并不直接在那里。