我应该使用哪些 gcc 优化标志?

问题描述 投票:0回答:3

如果我想最小化我的 C 程序运行时间,我应该使用什么优化标志(我也想保持标准)

目前我正在使用:

 -Wall -Wextra -pedantic -ansi -O3

我也应该使用

-std=c99

例如?

我是否应该按照特定顺序将这些标志放在我的 makefile 中?有什么区别吗?

还有,有什么理由不使用我能找到的所有优化标志吗?他们曾经互相对抗过或类似的事情吗?

c gcc optimization compiler-optimization c99
3个回答
4
投票

我建议使用

-std=gnu11
-std=c11
编译新代码(如果需要)。 (或者最近有更新的版本,如
-std=gnu23
)。启用
-Wall
;对于风格和清晰度来说,“修复”任何此类警告通常是一个好主意,即使它们不是真正的正确性问题,例如添加括号,以便在运算符优先级可能很棘手的情况下更容易看到操作顺序。
-Wextra
会警告您可能不想更改的某些内容,但查看它发现的内容仍然很有用。


检查编译情况的一个好方法是查看编译器的 asm 输出。 http://gcc.godbolt.org/ 很好地格式化了 asm 输出(消除了噪音)。如果您完全了解 asm,那么将一些关键函数放在那里并查看不同编译器版本的作用是很有用的。


使用新的编译器版本。 gcc 和 clang 在新版本中都有显着改进。 gcc 5.3 和 clang 3.8 是当前版本。在某些情况下,gcc5 生成的代码明显比 gcc 4.9.3 更好。


如果您只需要二进制文件在自己的机器上运行,则应该使用

-O3 -march=native

如果您需要二进制文件在其他机器上运行,请使用

-mssse3 -mpopcnt
之类的内容选择指令集扩展的基线。您可以使用
-mtune=haswell
来针对 Haswell 进行优化,即使编写的代码仍然在较旧的 CPU 上运行(由
-march
确定)。


如果您的程序不依赖于严格的 FP 舍入行为,请使用

-ffast-math
。如果是这样,您通常仍然可以使用
-fno-math-errno
之类的东西,而无需启用
-funsafe-math-optimizations
。一些 FP 代码可以通过快速数学获得big加速,例如自动向量化。


如果您可以有效地对程序进行测试运行,以练习实际运行时需要优化的大部分代码路径,那么请使用配置文件导向的优化:

gcc  -fprofile-generate -Wall -Wextra -std=gnu11 -O3 -ffast-math -march=native -fwhole-program *.c -o my_program
./my_program -option1 < test_input1
./my_program -option2 < test_input2
gcc  -fprofile-use      -Wall -Wextra -std=gnu11 -O3 -ffast-math -march=native -fwhole-program *.c -o my_program

-fprofile-use
启用
-funroll-loops
,因为它有足够的信息来决定何时实际展开。到处展开循环会让事情变得更糟。不过,值得尝试
-funroll-loops
看看是否有帮助。

如果您的测试运行没有覆盖所有代码路径,那么一些重要的代码路径将被标记为“冷”并且优化较少。


-O3
启用自动矢量化,而
-O2
则不启用。这可以带来很大的加速

-fwhole-program
允许跨文件内联,但仅当您将所有源文件放在一个 gcc 命令行上时才有效。
-flto
是获得相同效果的另一种方法。 (链接时间优化)。 clang 支持
-flto
但不支持
-fwhole-program

-fomit-frame-pointer
已经成为 x86-64 的默认设置有一段时间了,最近又成为 x86(32 位)的默认设置。


除了 gcc 之外,尝试使用 clang 编译你的程序。 Clang 有时会生成比 gcc 更好的代码,有时则更差。尝试两者并进行基准测试。


4
投票
标志

-std=c99

 不会更改优化级别。它只会改变您希望编译器确认的目标语言标准。

当您希望编译器将您的程序视为 C99 程序时,请使用

-std=c99


2
投票
与您指定的优化相关的唯一标志是

-O3

。其他人则用于其他目的。 

您可能想要添加

-funroll-loops

-fomit-frame-pointer
,但它们应该已经包含在 
-O3
 中。 

© www.soinside.com 2019 - 2024. All rights reserved.