人们说,与其他专有编译器相比,GCC(GNU编译器集合)不能生成有效的代码。这是神话还是现实?我们会试着弄清楚GCC到底是怎么回事。那么,GCC编译器如何才能产生更有效的代码呢?我们将介绍一些用于x86Linux平台";C";、";C++&34;和";FORTRAN&34;编译的可选提示,帮助您从GCC那里获得更高的性能。对于那些需要更高性能,但由于各种原因不使用专有编译器的客户和开发人员来说,它应该很有用。
(1)默认GCC优化级别设置为";-O0";。GCC手册中没有任何优化选项,编译器的目标是降低编译成本,使调试产生预期的结果。该默认行为提供的性能非常低,并且不建议在发布编译时仅使用";GCC命令。GCC不识别体系结构,除非您添加";-march=原生选项。默认情况下,GCC传递在其配置中设置的选项。我们来看看GCC是如何配置的:
这意味着GCC将在命令行选项中添加";-march=corei7&34;。大多数用于x86的GCC编译器(默认在64位LINUX中)在命令行选项中添加:";-mtune=GENERIC-MARCH=x86-64";按照相应的配置。您始终可以通过运行以下命令来检查GCC驱动程序传递的选项和内部选项:
此命令将在没有任何特定架构优化的情况下构建";test.c";,并且可能导致严重的性能损失(与专门调优的代码相比)。减少(或关闭)矢量化和低效的代码调度是性能损失的最常见原因。要获得更高的性能,您应该使用以下命令:
定义您的体系结构很重要!唯一的例外是,当链接的程序几乎所有执行时间都花在GLIBC函数上时,因为大多数函数在运行时确定当前体系结构函数的最佳代码。请注意,一些常用的静态GLIBC函数没有体系结构专门化。如果您想要更快的GLIBC,动态链接更好。
(2)默认情况下,大多数32位模式的GCC x86编译器使用x87浮点模型,因为没有配置";mfpath=sse";。仅当GCC配置为--with-mfpath=sse&34;时:
默认使用SSE浮点模型。在其他情况下,您应该指定";-mfpath=sse";以提高浮点性能。此频繁使用的命令可能会导致浮点代码性能显著下降:
在32位模式下,添加";-mfpath=sse";非常重要!唯一的例外是当您的编译器被配置";--with-mfpath=sse";时。
使用32位模式来减少内存使用,从而减少内存访问时间(因为缓存中可以找到更多的数据)。因此,在64位模式下,可用寄存器的数量从6个增加到14个,从8个增加到16个XMM。另外,默认情况下,所有64位x86架构都有SSE2扩展(因此您不需要添加";-mfpath=sse";)。建议HPC应用使用64位,手机和平板电脑应用使用32位。
GCC编译器提供了大量的试用机会,以实现更高的性能。下面,我们提供了一个汇总表,其中包含对英特尔®凌动™和第二代英特尔®酷睿™i7处理器的建议和预测,并根据GCC 4.7中的结果,将其与仅使用";-O2&34;选项进行比较,假设GCC配置为x86-64通用处理器。
平板电脑和手机中常用应用程序相对于";-O2&34;的性能提升预测(仅在32位模式下,因为手机和平板电脑上的应用程序很常见):
64位到32位模式在HPC应用程序中的优势为";-O2-mfpath=sse";约为5%请注意,本文中的所有数字都是根据特定基准集进行预测的结果。
以下是所用选项的简短摘要列表。您可以在http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html";上找到完整的选项列表和说明。
";-Ofast";与";-O3-ffast-MATH";相同启用算术计算的高级优化和积极优化(如浮点重新关联)。
";-mfpath=sse";启用浮点指令中的XMM寄存器(而不是x87模式下的堆栈)