【问题标题】:GCC hidden optimizationsGCC 隐藏优化
【发布时间】:2022-02-07 14:57:00
【问题描述】:

GCC manual 列出了应用于不同优化级别(-O1、-O2 等)的所有优化标志。但是,在编译和测量基准程序(例如 cBench 的汽车位计数)时,应用优化级别而不是手动打开所有列出的优化时存在显着差异。对于带有 auto_bitcount 程序的 -O1,我测量了在使用 -O1 编译而不是手动应用所有列出的标志时大约 100% 的加速。这些“隐藏”的优化实际上似乎是 GCC 为 -O1 所做的优化工作的主要部分。手动应用标志时,与没有优化相比,我只能获得大约 10% 的加速。 当应用来自gcc -c -Q -O3 --help=optimizers 的所有启用标志时,可以观察到相同的情况。

在 GCC 手册中,我找到了解释这种行为的部分:

并非所有优化都直接由标志控制。本节仅列出具有标志的优化。 大多数优化在 -O0 或未在命令行上设置 -O 级别时完全禁用,即使指定了单独的优化标志。

由于我找不到有关这些优化的任何进一步文档,我想知道是否有控制它们的方法以及详细的优化是什么?

【问题讨论】:

    标签: gcc optimization


    【解决方案1】:

    一些优化直接由-O 标志控制,例如complete unroller:

    {
    public:
      pass_complete_unrolli (gcc::context *ctxt)
        : gimple_opt_pass (pass_data_complete_unrolli, ctxt)
      {}
    
      /* opt_pass methods: */
      virtual bool gate (function *) { return optimize >= 2; }
      virtual unsigned int execute (function *);
    
    }; // class pass_complete_unrolli
    

    对于其他人-O 会影响他们的内部算法,例如在optimization of expressions:

             /* If FROM is a SUBREG, put it into a register.  Do this
                so that we always generate the same set of insns for
                better cse'ing; if an intermediate assignment occurred,
                we won't be doing the operation directly on the SUBREG.  */
             if (optimize > 0 && GET_CODE (from) == SUBREG)
               from = force_reg (from_mode, from);
    

    没有办法解决这个问题,你必须使用-O

    【讨论】:

    • 感谢您的回答并将我指向源代码中的相关部分!很遗憾 GCC 没有在这里提供更多的配置。您是否还列出了以这种方式应用的所有优化的列表?
    • @tierriminator 不是真的,-O 的使用分散在整个代码库中。我刚刚找到了\<optimize\>\|\<x_optimize\> 的来源。请注意,此类列表需要针对每个 GCC 版本进行具体说明。
    • 确实如此。但是他们已经发布了特定的手册……
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2021-12-08
    • 2022-01-15
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多