C++ 自动查找给定计算机上最快exe的编译器选项?

C++ 自动查找给定计算机上最快exe的编译器选项?,c++,optimization,compiler-construction,compiler-flags,C++,Optimization,Compiler Construction,Compiler Flags,有没有一种方法可以自动找到最佳的编译器选项(在给定的机器上),从而产生尽可能快的可执行文件 当然,我使用的是g++-O3,但是还有一些额外的标志可以使代码运行更快,例如-ffast math和其他标志,其中一些标志依赖于硬件 有人知道我可以在configure.ac文件(GNU autotools)中放入一些代码,以便通过/configure命令自动将标志添加到Makefile中吗 除了自动确定最佳标志外,我还对一些有用的编译器标志感兴趣,这些标志可以用作大多数优化可执行文件的默认标志 更新:大

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

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

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

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

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

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

没有

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

一些编译器提供“-fast”选项为给定编译主机自动选择最激进的优化

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


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

我不认为您可以在配置时这样做,但至少有一个程序会尝试优化给定特定可执行文件和机器的gcc选项标志。例如,见


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

嗯-是的。这是可能的。查看。

在谷歌搜索之后,我发现了以下脚本:

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

-march=pentium4 -mfpmath=sse
$ ./gcccpuopt 
Warning: The optimum *32 bit* architecture is reported
-m32 -march=core2 -mfpmath=sse
在另一台机器(64位)上,它输出:

-march=pentium4 -mfpmath=sse
$ ./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章“嵌套异构数据结构”对此进行了描述


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

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


一旦你做到了这一点,如果你的应用程序是计算绑定的,并且代码中有热点(而不是库代码),那么编译器对速度的优化将产生一些不同,因此你可以尝试不同的标志组合。

最佳的优化选项取决于你的代码实际执行的功能。只有你知道这一点。要让它“进入11点”,你应该对它进行分析。在编译器切换方面,剩下的免费午餐不多了。好吧,要真正根据我的代码来定制它,我应该手动选择选项并对它们进行分析。但是在那台机器上添加适当的
-march=cpu类型也无妨吧?应该有某些类别的程序从某些其他(依赖硬件的)编译标志中获益?例如,我的程序属于“使用大量浮点运算”类别。此外,尽可能使用
-mfpmath=sse
似乎也很有用。GCC文档说:“在大多数情况下,生成的代码应该要快得多。”()。为什么不使用-march=native?这应该能够启用SSEn浮点,除此之外。顺便说一句,这正是Acovea(由@ergosys提到)所做的:使用GCC优化标志和“进化”的不同组合编译和基准测试程序数百次,甚至数千次(这就是为什么程序必须简单,基准测试必须简短的原因)使用遗传算法的一组很好的标志。ATLAS(自动调整线性代数软件)也是如此,这是BLAS/LAPACK的一个实现。请参阅指向Acova的链接已断开。以下是备选方案: