7

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

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

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

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

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

4

8 回答 8

4

我认为您不能在配置时执行此操作,但至少有一个程序会尝试优化给定特定可执行文件和机器的 gcc 选项标志。例如,请参阅http://www.coyotegulch.com/products/acovea/

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

于 2010-03-14T18:52:57.700 回答
4

嗯 - 是的。这个有可能。查看配置文件引导优化

于 2010-03-14T18:53:29.030 回答
2

经过一番谷歌搜索,我发现了这个脚本:gcccpuopt

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

-march=pentium4 -mfpmath=sse

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

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

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

于 2010-03-14T19:27:14.170 回答
2

另见-mcpu=native/ -mtune=nativegcc 选项。

于 2010-03-14T19:55:47.810 回答
2

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

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

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

于 2010-03-14T18:48:27.270 回答
1

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

不。

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

于 2010-03-14T18:40:37.780 回答
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++)。

于 2010-03-15T01:11:11.140 回答
-2

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

这是我正在谈论的一个例子。

完成此操作后,如果您的应用程序受计算限制,并且代码中有热点(而不是库代码中),那么编译器对速度的优化会有所不同,因此您可以尝试不同的标志组合。

于 2010-03-15T14:17:17.593 回答