我正在为 Intel Atom 处理器开发性能关键型应用程序。
这个 CPU 最好的 gcc 优化标志是什么?
有一个很酷的框架,叫做Acovea(通过进化算法分析编译器选项),由 GCC 黑客之一的 Scott Rober Ladd 编写。它是一个遗传/进化算法框架,试图通过自然选择优化特定代码段的 GCC 优化标志。
它的工作原理是这样的:您编写一小段基准代码(它确实必须很小,因为它将被重新编译和执行数千次),代表您要优化的较大程序的性能特征。然后,Acovea 随机构建了几十个不同的 GCC 命令行,并使用它们中的每一个编译和运行您的基准测试。然后允许这些命令行中最好的“交配”和“繁殖”新的“孩子”,这些“孩子”(希望)从他们的“父母”那里继承最好的“基因”。这个过程重复了几十“代”,直到出现一组稳定的命令行标志。
GCC 4.5 将包含 -march=atom 和 -mtune=atom 选项。
来源: http: //gcc.gnu.org/gcc-4.5/changes.html
我有一个脚本可以自动为您的 CPU 和编译器组合选择适当的标志。我刚刚更新了它以支持 Intel Atom:
http://www.pixelbeat.org/scripts/gcccpuopt
更新:我之前为 Atom 指定了 -march=prescott,但进一步研究表明 Atom 符合 merom ISA,因此 -march=core2 更合适。但是请注意,Atom 是有序内核,最后一个是原始的 pentium。因此,-mtune=pentium 也可能更好。不幸的是,我没有要测试的 Atom。如果有人可以对以下之间的差异进行基准测试,我将不胜感激:
-march=core2 -mfpmath=sse -O3
-march=core2 -mtune=pentium -mfpmath=sse -O3
更新:这里有几篇关于 Atom 低级优化的好文章:
好吧,Gentoo wiki 为 prescott 声明:
http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
就像奔腾 4:
-march=prescott -O2 -pipe -fomit-frame-pointer
我不知道 GCC 是否有任何特定于 Atom 的优化标志,但 Atom 内核应该与原始 Pentium 非常相似,并且非常重要地添加了 MMX/SSE/SSE2/SSE3/SSSE3 指令集。当然,这些只有在您的代码是浮点数或 DSP-heavy 时才会产生显着差异。
也许你可以尝试:
gcc -O2 -march=pentium -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse
这里有一些博客的交叉授粉......我真正希望的是一个Firefox-compiled-for-atom基准......
地址:http://ivoras.sharanet.org/blog/tree/2009-02-11.optimizing-for-atom.html
“事实证明,gcc 似乎在使用 -mtune=native 时做得非常不错,而且 mtune=generic 是可以接受的。最大的收益(在这个数学密集的基准测试中)来自使用 SSE 进行数学计算,但即使他们被 pentium4 调优破坏。
“最快和最慢优化之间的差异是 21%。使用 March 而不是 mtune 的影响可以忽略不计(没有足够的差异来判断它是否有帮助)。
“(我包含 k6 仅供参考 - 我知道 Atom 没有 3dnow)
“后期更新:调整 k8(使用 SSE 和 O3)产生的最佳分数略高,为 182。”
i686 最接近。不要去core2。
GCC 4.1 -O3 -march=i686 GCC 4.3 -O3 -march=native
GCC 4.1 -O4 -ffast-math GCC 4.3 -O4 -ffast-math
http://macles.blogspot.com/2008/09/intel-cc-compiler-gcc-and-intel-atom.html