GNU C ++编译器g ++的优化级别表,准确吗?

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

虽然我知道每个程序都是不同的场景,但考虑到下表,我有一个相当具体的问题。


GNU C ++编译器g++的优化级别

Ox      WHAT IS BEING OPTIMIZED                          EXEC  CODE  MEM  COMP
                                                         TIME  SIZE       TIME
------------------------------------------------------------------------------
O0      optimize for compilation time                   |   +    +    -    -
O1      optimize for code size and execution time #1    |   -    -    +    +
O2      optimize for code size and execution time #2    |   --   0    +    ++
O3      optimize for code size and execution time #3    |   ---  0    +    +++
Ofast   O3 with fast none accurate math calculations    |   ---  0    +    +++
Os      optimize for code size                          |   0    --   0    ++

+增加++增加更多+++增加更多 - 减少 - 减少更多 - 减少甚至更多


我使用的是8.2版本,但这应该是从here获取的通用表格,并重新写入纯文本。

我的问题是,如果它可以信任,我不知道那个网站,所以我最好问一下这里的专业人士。那么,表格或多或少准确吗?

g++ compiler-optimization
1个回答
1
投票

你的表非常准确。

请注意,海湾合作委员会有数以万计的optimization options。在-O3甚至没有启用一些奇怪的优化传递(但是GCC有几百个优化传递)。

但是,无法保证-O3优化始终会提供比使用-O2编译的相同代码运行得更快的代码。通常情况如此,但并非总是如此。您可以找到病态(或只是)奇怪的C源代码,当使用-O3编译时,它提供的二进制代码比使用-O2编译的相同C源代码稍慢。例如,-O3可能比unroll loops更好“-O2” - 更少“更多”,但是如果某些特定的循环更加展开,某些代码可能表现更差。 phoronix网站和其他人正在对GCC进行基准测试,并且正在观察这种现象。

请注意,优化是一门艺术,它通常是一个难以处理或不可判定的问题,并且当前的处理器非常复杂,没有完整的性能模型(考虑缓存,分支预测器,管道,不属于 - 订单执行)。此外,x86处理器的详细微架构显然不公开(你无法获得英特尔或AMD芯片的VHDL或芯片布局)。因此,GCC的-march=选项也很重要(同样的二进制代码在AMD和英特尔芯片上都不是很好,甚至在几个品牌的英特尔处理器上也是如此)。因此,如果在运行它的同一台机器上编译代码,建议在-march=native-O2之外传递-O3

英特尔和AMD支付的人员正积极为GCC做出贡献,但不允许他们分享他们内部有关英特尔或AMD芯片的所有知识。他们被允许共享(使用GCC的GPLv3 +许可证)他们为GCC编译器贡献的源代码。可能来自AMD的工程师正在观察英特尔提供的GCC代码,以猜测英特尔芯片的微架构细节,反之亦然。

英特尔或AMD的利益显然包括让GCC与其专有芯片一起运作良好。公司利益证明支付(在英特尔和AMD)几位高素质的编译工程师为GCC提供全职工作。

在实践中,我观察到AMD和英特尔工程师都在“玩游戏”开源:他们经常提供GCC代码,这也提高了竞争对手的性能。这是一个社会,道德和经济问题,而不是技术问题。

PS。你可以找到很多关于开源经济学的论文和书籍。

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