Dun*_*nie 217 c++ optimization g++ compiler-flags
我从各种来源(虽然大多数来自我的同事)中听到过,-O3用g ++ 的优化级别进行编译在某种程度上是"危险的",并且除非被证明是必要的,否则应该避免.
这是真的,如果是的话,为什么?我应该坚持-O2吗?
Pla*_*aHH 209
在GCC(2.8等)的早期阶段,在电梯群控系统的时候,和redhat 2.96 -O3是相当马车的时候.但这是十多年前的事了,而-O3与其他优化水平(在马车上)并没有多大差别.
然而,它确实倾向于揭示人们依赖未定义行为的情况,因为更严格地依赖于语言的规则,特别是角落案例.
作为我个人而言,我现在正在运行的生产软件在金融领域具有多年-O3,还没有遇到过,不会一直存在,如果我会用-02的错误.
根据大众需求,这里增加了一个:
-O3,尤其是-funroll-loops(未由-O3启用)等附加标志有时会导致生成更多的机器代码.在某些情况下(例如,在具有异常小的L1指令高速缓存的cpu上),由于例如一些内部循环的所有代码现在不再适合L1I,这可能导致减速.通常gcc很难不生成如此多的代码,但由于它通常会优化通用情况,因此可能会发生这种情况.特别容易出现这种情况的选项(如循环展开)通常不包含在-O3中,并在联机帮助页中相应标记.因此,通常最好使用-O3来生成快速代码,并且在适当时(例如,当分析器指示L1I未命中时)仅回退到-O2或-Os(其尝试优化代码大小).
如果你想优化到极致,你可以通过--param调整gcc与某些优化相关的成本.另外请注意,gcc现在能够将属性放在控制这些函数的优化设置的函数中,所以当你发现在一个函数中有-O3的问题时(或者想要为该函数试用特殊的标志),你不需要用O2编译整个文件甚至整个项目.
otoh似乎在使用-Ofast时必须小心,它指出:
-Ofast启用所有-O3优化.它还支持对所有符合标准的程序无效的优化.
这让我得出结论,-O3旨在完全符合标准.
zwo*_*wol 40
这已经在Neel的回答中说过,但不是明显或强烈的:
在我有点格格不入的经验中,应用于-O3整个程序几乎总是使它变慢(相对于-O2),因为它打开了积极的循环展开和内联,使程序不再适合指令缓存.对于较大的程序,这对于-O2相对来说也是如此-Os!
预期的使用模式-O3是,在对程序进行概要分析后,您手动将其应用于少数几个包含关键内部循环的文件,这些文件实际上受益于这些激进的空间 - 速度权衡.对于最近的GCC,我认为闪亮的新链接时间配置文件引导优化模式可以选择性地将-O3优化应用于热门功能 - 有效地自动化此过程.
除了较低级别'-O2'和'-O1'的所有优化之外,-O3选项还会启用更昂贵的优化,例如函数内联.'-O3'优化级别可以提高生成的可执行文件的速度,但也可以增加其大小.在这些优化不利的某些情况下,此选项实际上可能会使程序变慢.
是的,O3令人讨厌。我是一名编译器开发人员,而且我已经确定由O3引起的清晰明显的gcc错误,这些错误是由O3在构建自己的软件时生成有问题的SIMD汇编指令引起的。据我所知,大多数生产软件都附带O2,这意味着O3在测试和错误修复方面的关注度会降低。
这样想:O3在O2之上添加了更多的转换,在O1之上添加了更多的转换。从统计上讲,更多的转换意味着更多的错误。对于任何编译器都是如此。
| 归档时间: |
|
| 查看次数: |
99474 次 |
| 最近记录: |