在给定的机器上自动查找最快的exe的编译器选项?

时间:2010-03-14 18:33:42

标签: c++ optimization compiler-construction compiler-flags

是否有一种方法可以自动找到最佳的编译器选项(在给定的机器上),从而产生最快的可执行文件?

当然,我使用g++ -O3,但是还有其他标志可以使代码运行得更快,例如-ffast-math和其他人,其中一些依赖于硬件。

有没有人知道我可以在我的configure.ac文件(GNU autotools)中放入一些代码,以便通过./configure命令自动将标志添加到Makefile中?

除了自动确定最佳标志之外,我还会对一些有用的编译器标志感兴趣,这些标志最适合用作大多数优化的可执行文件的默认值。

更新:大多数人建议只尝试不同的旗帜并根据经验选择最好的旗帜。对于那个方法,我有一个后续问题:是否有一个实用程序列出了我正在运行的机器可能的所有编译器标志(例如测试SSE指令是否可用等)?

8 个答案:

答案 0 :(得分:4)

我认为你不能在configure-time执行此操作,但至少有一个程序试图在给定特定可执行文件和机器的情况下优化gcc选项标志。例如,请参阅http://www.coyotegulch.com/products/acovea/

您可以在对目标计算机有一定了解的情况下使用它来为您的代码找到一组好的选项。

答案 1 :(得分:4)

嗯 - 是的。这个有可能。查看profile-guided optimization

答案 2 :(得分:2)

某些编译器提供“-fast”选项,以自动为给定的编译主机选择最积极的优化。 http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler

不幸的是,g ++没有提供类似的标志。

作为下一个问题的后续内容,对于g ++,您可以将-mtune选项与-O3一起使用,这将为您提供相当快的默认值。然后挑战是找到编译主机的处理器类型。你可能想看看autoconf宏档案,看看有人写了必要的测试。否则,假设是linux,你必须解析/proc/cpuinfo以获得处理器类型

答案 3 :(得分:2)

经过一些谷歌搜索后,我找到了这个脚本:gcccpuopt

在我的一台机器(32位)上输出:

-march=pentium4 -mfpmath=sse

在另一台机器(64位)上输出:

$ ./gcccpuopt 
Warning: The optimum *32 bit* architecture is reported
-m32 -march=core2 -mfpmath=sse

所以,它并不完美,但可能会有所帮助。

答案 4 :(得分:2)

另请参阅-mcpu=native / -mtune=native gcc选项。

答案 5 :(得分:1)

  

是否有一种方法可以自动找到最佳的编译器选项(在给定的机器上),从而产生最快的可执行文件?

没有

您可以使用各种各样的编译器选项编译您的程序,然后对每个版本进行基准测试,然后选择“最快”的版本,但这几乎不可靠,可能对您的程序没用。

答案 6 :(得分:0)

这是一个适合我的解决方案,但设置确实需要一些时间。在Hans Petter Langtangen的“Python Scripting for Computational Science”中(我认为这是一本优秀的书),给出了一个使用短python脚本进行数值实验来确定C / Fortran / ...的最佳编译器选项的例子。程序。这将在第1.1.11节“嵌套异构数据结构”中进行描述。

本书中的示例源代码可在http://folk.uio.no/hpl/scripting/index.html免费获取(我不确定许可证,因此不会在此处复制任何代码),特别是您可以找到类似数值测试的代码在文件src / app / wavesim2D / F77 / compile.py中的TCSE3-3rd-examples.tar.gz中的代码中,您可以将其用作编写适合特定系统/语言的脚本的基础(C ++)在你的情况下)。

答案 7 :(得分:-2)

优化您的应用程序主要是您的工作,而不是编译器。

Here's an example of what I'm talking about.

一旦你完成了这个,如果你的应用程序受计算限制,代码中有热点(而不是库代码中)那么编译器对速度的优化会产生一些影响,所以你可以尝试不同的标志组合。