GCC:冲突的优化

Posted

技术标签:

【中文标题】GCC:冲突的优化【英文标题】:GCC: conflicting optimizations 【发布时间】:2014-08-30 07:19:11 【问题描述】:

由于构建时间较长,我无法充分缩小导致internal compiler error: Segmentation fault 的罪魁祸首(不过,我已经设法排除了 LTO)。存在于 GCC 版本 4.8.2、4.8.3 和 4.9.1 中,而不是一个错误,我怀疑其余各种优化策略之间存在冲突:

通用:很可能不相关,这里是为了完整性

-管道 -march=native -O3 -msse2 -mfpmath=sse -ffast-math

Graphite:关于内存访问的循环优化

-floop-interchange -floop-strip-mine -floop-block

石墨:不太确定

-fgraphite-identity

ISL:关于内存访问和自动并行的循环优化

-floop-nest-optimize

Graphite:关于自动并行的循环优化

-floop-parallelize-all -ftree-parallelize-loops=2

选项集似乎共享重要的功能重叠。如果这可能导致编译期间出现分段错误,我应该保留哪些选项以及应该剔除哪些选项以最大限度地提高性能?

【问题讨论】:

尝试使用-pipe -march=native -O2 构建,看看是否可行。如果是这样,请尝试-O3,然后添加您想要的任何内容,直到它再次中断。并且请不要告诉我们您的构建时间太长,您无法做到这一点……如果您的构建时间那么长,那么您可能真的不需要这么多深奥的选项。 :) 段错误是在您运行编译器时,而不是在您运行代码时,不是吗? @Christophe 哦,对不起,我的错 无论你给出什么选项,编译器都不应该出现段错误。如果可能的话,把你的代码删减到很小,然后把它报告给 gcc 的人。一旦你报告了它,你可能会得到一些关于如何解决它的建议...... 【参考方案1】:

最终将 segfault 缩小到 -ffast-math-floop-parallelize-all 选项,仅此而已。此问题与[4.8/4.9 Regression] [graphite] Segmentation fault with -Ofast -floop-paralle... 相同,应在上游修复。由于该修复是在 6 月 29 日推送的,而 gcc 4.9.1 是在 7 月 16 日发布的,它是在 4 月分支的,它不包含在 4.8.3 和 4.9.1 版本中。

【讨论】:

以上是关于GCC:冲突的优化的主要内容,如果未能解决你的问题,请参考以下文章

禁用 GCC 中的所有优化选项

《编译 - 编译杂记》GCC优化等级说明

如果我设置优化-O3,C++ 整个程序优化是不是在 gcc 中完成?

GCC 优化级别有多少?

GCC-O优化等级

如何在 gcc 中启用单个优化标志?