【问题标题】:How to find out which optimizations are actually applied when using gcc?如何找出使用 gcc 时实际应用了哪些优化?
【发布时间】:2013-01-22 03:23:20
【问题描述】:

使用 IBM 的 XL 编译器系列,可以提供两个选项(-qreport-qlist)来为每个源文件生成报告,其中包括应用了哪些优化或哪些部分代码无法优化的信息(以及为什么)。

是否有可能获得关于 GNU 的 g++ 的类似报告?如果可以,该怎么做?

【问题讨论】:

  • 我无法想象 GCC 不能做 IBM 的编译器能做的事情(除了崩溃)。
  • 我刚刚更新了我的问题,包括“如何”,而不仅仅是“如果”。

标签: c++ gcc compilation g++ compiler-optimization


【解决方案1】:

查看-fdump-tree-[switch] 标志。您可以使用-fdump-tree-all 获取大量信息。

也可以在trunk gcc -fopt-info-[options] 中访问更高级别的优化信息,例如当应用特定优化时,错过等,例如

-fopt-info-inline-optimized-missed

打印所有成功和错过的内联优化(在本例中为stderr)。这显然是相当新的功能,所以我不确定它的支持程度。

在早期版本中,他们有 -ftree-vectorizer-verbose=n,现在已弃用,取而代之的是 opt-info。

所有这些选项都列在这里https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html,尽管挑选有用的选项可能有点棘手。

【讨论】:

  • 据我所知,“-fdump-tree-[switch]”输出只给了我编译过程在各个阶段的结果(即“什么”),而不是“如何”和“为什么”。有没有办法获得一些关于编译器做什么的高级信息(可能有适当的后处理)?
  • @Michael 我添加了一些更有用的标志,但这取决于您的 gcc 的前沿程度。从好的方面来说,这似乎有了很大的改善。
  • 这似乎正是我要找的,谢谢。这个功能到底有多先进? 4.7.2(我们的版本)没有,所以我猜目前只有开发版。
  • 是的,似乎只在后备箱中。在 4.8 更改列表中也没有提及它。我只是简单地玩过它,所以不确定它对所有传球的效果如何,但它在一些简单的测试中效果很好。
【解决方案2】:

使用-S -fverbose-asm 列出汇编器输出标头中每个静默应用的选项(包括优化选项)。

【讨论】:

  • 这不是 -S 的默认值吗?
  • 当然没有。只需尝试使用 -fverbose-asm 和不使用,看看区别。
  • 刚刚在 linux 上使用 gcc 4.8.2 和 4.1.2 进行了验证,效果很好,这个技巧不仅限于优化选项,而是所有隐式选项。我会多次检查程序集列表,但从未注意到标题包含如此有用的信息。
【解决方案3】:

来自https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Optimize-Options.html#Optimize-Options

您可以使用-Q --help=optimizers 调用 GCC,以找出在每个级别启用的确切优化集。

示例:(启用优化选项的计数)不需要文件。

$ g++ -std=c++17 -O2 -Q --help=optimizers 2>&1 |grep enabled |wc -l
135

注意many optimizations enabled by -O1/2/3 have no individual flags(另见:c++ - g++ O1 is not equal to O0 with all related optimization flags - Stack Overflow

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多