我们正在从一个带有2 * Xeon X5650的本地计算服务器转移到另一个带有2 * Opteron 4280的计算服务器......今天我试图在新机器(AMD one)上启动我精彩的C程序,并发现了性能的显着下降> 50%,保持所有可能的参数相同(甚至是随机数发生器的种子)。我开始深入研究这个问题:谷歌搜索“amd opteron 4200编译器选项”给了我几个建议,即“标志”(选项)供GCC 4.6.3编译器使用。我玩这些旗帜并在这里的情节中总结了我的发现......
我不允许上传图片,因此图表在https://plus.google.com/117744944962358260676/posts/EY6djhKK9ab
我想知道是否有人(编码人员)可以就此问题给我任何评论,特别是我对“... -march = bdver1 -fprefetch-loop-arrays”这一事实感兴趣“... -fprefetch-loop-arrays -march = bdver1”在不同的运行时产生? 我不确定是否,假设“-funroll-all-loops”已经包含在“-O3”或“-Ofast”中,为什么然后再添加这个标志会有什么不同呢? 为什么英特尔处理器的任何额外标志会使性能更差(只有“-ffast-math” - 这是显而易见的,因为根据我的理解,它可以实现定义浮点运算的精度和速度更快,但是...... )吗
关于机器和我的程序的更多细节: 2 * Xeon X5650机器是带有gcc 4.4.3的Ubuntu服务器,它是2(主板上的CPU)X6(每个真实核心)* 2(超线程)= 24线程机器,并且在它上面运行了一些东西,期间我的“实验”或基准......
2 * Opteron 4280机器是带有gcc 4.6.3的Ubuntu服务器,它是2(主板上的CPU)X4(每个真实核心= Bulldozer模块)* 2(AMD Bulldozer无论线程是什么类型的核心) = 18线程机器,我只是用它来做我精彩的“基准测试”......我的基准程序只是一个蒙特卡罗模拟的东西,它在开始时做了一些IO,然后~10 ^ 5 Mote Carlo循环给我结果。所以,我假设它是整数和浮点计算程序,时不时地循环并检查随机生成的“结果”对我来说是否“足够好”......程序只是一个单线程,而我每个基准测试使用相同的参数启动它(很明显,但无论如何我应该提到它),包括随机生成器种子(因此,结果是100%相同)...程序不是内存强度。生成的运行时只是标准“/ usr / bin / time”命令的“用户”时间。