GCC建议和最快代码选项

rwa*_*ace 24 c++ unix gcc

我正在分发一个带有Unix版本的makefile的C++程序,我想知道我应该使用哪些编译器选项来获得最快的代码(它属于可以使用它们可以获得的所有计算能力的程序类别鉴于我事先并不知道用户将拥有什么硬件,操作系统或gcc版本,并且我最重要的是要确保它至少在每个主要类Unix上都能正常运行操作系统.

到目前为止,我有,我g++ -O3 -Wno-write-strings还有其他选择吗?在Windows上,Microsoft编译器可以选择快速调用约定和链接时间代码生成等值得使用的选项,gcc上有没有等价物?

(我假设它在64位平台上默认为64位,如果不是这样,请纠正我.)

Il-*_*ima 16

在不知道你的程序的任何细节的情况下,很难说.O3涵盖了大多数优化.其余选项"需要付费".如果您可以容忍一些随机舍入,并且您的代码不依赖于IEEE浮点标准,那么您可以尝试-Ofast.这忽视了标准合规性,可以为您提供更快的代码.

剩余的优化标志只能提高某些程序的性能,但甚至可能对其他程序有害.查看gcc文档中有关优化标志的可用标志并对其进行基准测试.

另一种选择是启用C99(-std = c99)和内联适当的功能.这是一个艺术,你不应该内联所有内容,但通过一些工作,你可以让你的代码更快(虽然以更大的可执行文件为代价).

如果速度真的是一个问题我建议回到微软的编译器,或尝试英特尔的.我开始意识到一些gcc编译代码的速度有多慢,特别是涉及math.h时.

编辑:哦等等,你说C++?然后忽略我的C99段落,你可以内联:)


Bas*_*ard 13

我会尝试配置文件引导优化:

-fprofile-generate 启用通常用于检测应用程序的选项,以生成有助于以后使用基于配置文件反馈的优化重新编译的配置文件 -fprofile-generate编译时和链接程序时必须同时使用.下列选项启用:-fprofile-arcs, -fprofile-values,-fvpt.

您还应该给编译器提供有关程序运行的体系结构的提示.例如,如果它只能在服务器上运行,并且您可以在与服务器相同的机器上编译它,那么您可以使用它-march=native.否则,您需要确定用户将拥有哪些功能,并将相应的参数传递给GCC.

(显然你的目标是64位,所以GCC可能已经包含了比通用x86更多的优化.)

  • 对于那些想知道如何准确使用引导优化的人:/sf/answers/305676381/ (2认同)

The*_*ist 7

-oFast


请尝试-oFast而不是-o3

此处还有一个您可能希望有选择地启用的标志列表.

-ffloat店

-fexcess精度=风格

-ffast,数学

-fno-舍入数学

-fno-信令的NaN

-fcx-有限范围

-fno-数学错误号

-funsafe-数学优化

-fassociative,数学

-freciprocal,数学

-ffinite,数学只

-fno签署3/0

-fno截留数学

-frounding,数学

-fsingle精度恒定

-fcx Fortran的规则

此处提供完整的标志列表及其详细说明


小智 6

-fomit-frame-pointer除非您需要使用gdb进行调试(yuck),否则请考虑使用.这将为编译器提供一个用于变量的寄存器(否则这个寄存器会浪费在无用的帧指针上).

此外,您可以使用类似-march=core2或更常见的内容-march=native来使编译器使用更新的指令并进一步调整指定体系结构的代码,但为此必须确保您的代码不会在旧处理器上运行.

  • 附带说明一下,-O和-O {n}都启用了-fomit-frame-pointer,而不必大叫:) https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html (3认同)

rub*_*nvb 5

gcc -O3 不能保证是最快的。-O2 通常是一个更好的起点。之后,配置文件引导优化并尝试特定选项:http : //gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

这是一个很长的阅读,但可能值得。

请注意,gcc 4.5+ 中提供了“链接时间代码生成”(MSVC)又名“链接时间优化”

顺便说一下,Win64 没有特定的“fastcall”调用约定。只有“该”调用约定:http : //msdn.microsoft.com/en-us/magazine/cc300794.aspx


Jen*_*das 5

除了别人已经提出的建议,你当然应该尝试-flto.它可以实现链接时间优化,在某些情况下,它可以真正发挥魔力.

有关详细信息,请参阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html