【问题标题】:Is there any benefit to passing all source files at once to a compiler?一次将所有源文件传递给编译器有什么好处吗?
【发布时间】:2014-04-08 19:44:00
【问题描述】:

我已阅读有关“整个程序优化”(wpo)和“链接时间代码生成”(ltcg)的信息。

我想知道如果我一次将所有源代码从 cli 传递给编译器(如“g++ a.cpp b.cpp”),是否会进行更多的模块间分析? 还是只是要启用其中一个标志?

这方面的编译器之间有区别吗? 例如,英特尔编译器能否从这种做法中受益,而其他编译器却没有?

【问题讨论】:

  • 像任何优化一样,这在很大程度上取决于编译器(版本)。

标签: visual-c++ gcc compiler-construction clang icc


【解决方案1】:

我想知道如果我一次将所有源代码从 cli 传递给编译器(如“g++ a.cpp b.cpp”),是否会进行更多的模块间分析?

对于 GCC,不,这样做不会启用任何 WPO,每个翻译单元都是单独处理的。我 99% 确定 Clang 也是如此,并且 90% 确定大多数其他编译器也是如此。

使用 GCC,要启用模块间优化,您需要通过 -flto 开关明确请求它,它仍然单独处理每个翻译单元,但附加信息会写入目标文件,然后当它们链接在一起时进一步优化通过以产生最终输出。

【讨论】:

  • 当然。 +1 并立即删除 cmets。
【解决方案2】:

至少对于 GCC,是的(如果您提供正确的编译器标志)。

编译器根据它对程序的了解执行优化。使用-funit-at-a-time 标志将允许编译器在编译函数时考虑从文件中后面的函数获得的信息。 一次将多个文件编译为单个输出文件(并使用-funit-at-a-time)将允许编译器在编译每个文件时使用从所有文件中获得的信息

来源:GCC optimization options

虽然单独编译所有文件并启用 LTO 应该在概念上给出非常相似(或相同)的结果。

【讨论】:

  • 此选项现在已弃用 - 您提供的文档链接适用于 gcc 3.4,当前 gcc 是 4.8 甚至 4.9 - 大约更新了 10 年 :)
  • 嗯,截至gcc-6.1.0 documentation...我们确定这些信息已经过时了吗?
【解决方案3】:

英特尔 C++ 编译器 (ICC) 支持此作为过程间优化的一部分。正如 Jonathan 所提到的,每个源文件都使用 IPO 进行编译,并将它们存储在一个模拟目标文件中。必须使用 Intel 链接工具来链接模拟目标文件。在链接阶段,最后一次调用编译器(当使用 IPO 构建时)以跨所有模拟对象文件执行过程间优化。在https://software.intel.com/en-us/node/459446 记录了更多信息。

【讨论】:

  • 链接已过时,这是新链接:link
猜你喜欢
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 2011-08-16
  • 2012-09-23
  • 1970-01-01
  • 2018-06-27
  • 2015-11-24
  • 2010-11-11
相关资源
最近更新 更多