是否有一种方法可以自动找到最佳编译器选项(在给定机器上),从而产生最快的可执行文件?
当然,我使用
g++ -O3
,但是还有其他标志可以使代码运行得更快,例如-ffast-math
等,其中一些依赖于硬件。
有谁知道我可以在我的
configure.ac
文件(GNU 自动工具)中放入一些代码,以便通过 ./configure
命令将标志自动添加到 Makefile 中?
除了自动确定最佳标志之外,我还对一些有用的编译器标志感兴趣,这些编译器标志非常适合用作大多数优化的可执行文件的默认值。
更新:大多数人建议尝试不同的标志并凭经验选择最好的标志。对于该方法,我有一个后续问题:是否有一个实用程序列出了我正在运行的机器可能的所有编译器标志(例如测试 SSE 指令是否可用等)?
我认为您不能在配置时执行此操作,但至少有一个程序尝试在给定特定可执行文件和机器的情况下优化 gcc 选项标志。 例如,请参阅 http://www.coyotegulch.com/products/acovea/。
您可以在对目标机器有一定了解的情况下使用它来为您的代码找到一组好的选项。
嗯 - 是的。这是可能的。研究配置文件引导优化。
一些编译器提供“-fast”选项来自动为给定的编译主机选择最积极的优化。 http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler
不幸的是,g++ 不提供类似的标志。
作为下一个问题的后续问题,对于 g++,您可以将
-mtune
选项与 -O3
一起使用,这将为您提供相当快的默认值。接下来的挑战是找到编译主机的处理器类型。您可能想查看 autoconf 宏存档,看看有人编写了必要的测试。否则,假设是 Linux,你必须解析 /proc/cpuinfo
才能获取处理器类型
经过一番谷歌搜索,我找到了这个脚本:gcccpuopt。
在我的一台机器(32位)上,它输出:
-march=pentium4 -mfpmath=sse
在另一台机器(64位)上输出:
$ ./gcccpuopt
Warning: The optimum *32 bit* architecture is reported
-m32 -march=core2 -mfpmath=sse
所以,它并不完美,但可能会有所帮助。
另请参阅
-mcpu=native
/-mtune=native
gcc 选项。
是否有一种方法可以自动找到最佳编译器选项(在给定机器上),从而产生最快的可执行文件?
没有。
您可以使用多种编译器选项来编译您的程序,然后对每个版本进行基准测试,然后选择“最快”的版本,但这几乎不可靠,并且可能对您的程序没有用处。
这是一个适合我的解决方案,但设置确实需要一些时间。在 Hans Petter Langtangen 所著的《计算科学的 Python 脚本》(我认为这是一本优秀的书)中,给出了一个使用简短的 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++)的脚本的基础。
优化您的应用程序主要是您的工作,而不是编译器的工作。
完成此操作后,如果您的应用程序受计算限制,并且代码中存在热点(而不是库代码中),那么编译器对速度的优化将会产生一些影响,因此您可以尝试不同的标志组合。