是否可以并行编译单个 C++ 翻译单元?

Posted

技术标签:

【中文标题】是否可以并行编译单个 C++ 翻译单元?【英文标题】:Is it possible to compile a single C++ translation unit in parallel? 【发布时间】:2014-02-27 15:18:55 【问题描述】:

如果是这样,怎么做? (特别是如何使用例如 clang 或 gcc)

否则,为什么不呢?

【问题讨论】:

编译器可以高度并发,但单个翻译单元的真正并行性将是一项壮举。 我想知道为什么编译器供应商会关心使其成为可能。项目中通常有很多翻译单元来充分利用所有可用的处理器/内核。 听起来至少很难实现。也许你应该拆分你的翻译单元。 @JurajBlaho 我真的不知道这会有多难,但它可能是有道理的,例如对于大量模板化代码或使用大量仅标头库的代码。我只是想知道这是否可能(例如在 gcc 或 clang 中),或者如果这很难,知道原因对我来说会很有启发。 @gnzlbg 对于使用大量(大)头文件的代码,大多数编译器已经提供了一种称为预编译头文件的功能。 【参考方案1】:

我非常怀疑是否可以并行编译。

C 和 C++ 语言取决于评估顺序。文件中较高的#define 可能会改变其后所有内容的含义。在 C++ 中,运算符可能会调用一个函数或执行另一个操作,这取决于是否存在运算符覆盖函数。事实上,符号名称的存在或不存在可能会影响它是否被解释为变量或类型。

可以在不参考符号表的情况下并行完成的简单解析部分非常容易执行,以至于线程化它们几乎没有意义。而且难的部分天生就是序列化的。

一种语言可能被设计为允许在单个单元中进行并行编译,但它不会是 C。

【讨论】:

C++ 源文件的初始解释有很多顺序依赖,没错。 (我的公司实际上构建了一个 C++ 前端,用于确定此类依赖项的部分顺序,并为 C++11 并行评估它们,用于程序分析/转换目的)。但是一旦名称和类型解析完成,应该能够独立编译各个方法。【参考方案2】:

理论上可能,但在实践中毫无意义。

预处理器线程可以发出要编译的标记序列,而实际的编译线程可以在它们生成时拾取它们。类似地,链接器线程可以在生成编译函数时为其提供反馈,因为它可以在知道最后一个函数之前启动。

窥视孔优化也可以并行进行,这几乎是根据定义进行的。但这需要与其他优化步骤(例如内联)交替进行,这有点难以并行执行。

但正如 cmets 所指出的,任何真正的程序都有比核心更多的翻译单元。必须为单个 TU 同步两个线程会浪费时间。

链接当然是完全不同的事情。

【讨论】:

以上是关于是否可以并行编译单个 C++ 翻译单元?的主要内容,如果未能解决你的问题,请参考以下文章

在一个clang插件中,如何查看编译翻译单元是不是出错?

什么是 C++ 中的“翻译单元”?

如何让宋和卡蒂并行翻译忍者规则?

在命名空间中定义并在多个翻译单元中使用的变量的链接

注释会被翻译成机器代码吗? C++

由 C++ 编译器优化时,F2C 翻译的代码中断