哪些x86 C ++编译器本身就是多线程的?

时间:2010-12-13 14:49:46

标签: c++ multithreading compiler-construction

现在几乎每个用户在桌面(以及大量笔记本电脑)上都有2或4个核心。高级用户拥有6-12个核心,包括amd或i7。

哪些x86 / x86_64 C / C ++编译器可以使用多个线程进行编译?

已经有类似'make -j N'的解决方案,但有时(对于-fwhole-program-ipo),最后一个又大又慢的步骤是顺序开始的。

其中任何一个都可以:GCC,英特尔C ++编译器,Borland C ++编译器,Open64,LLVM / GCC,LLVM / Clang,Sun编译器,MSVC,OpenWatcom,Pathscale,PGI,TenDRA,Digital Mars?

编译器的线程数是否有一些上限,这是多线程的?

谢谢!

7 个答案:

答案 0 :(得分:5)

某些构建系统可以并行编译独立的模块,但编译器本身仍然是单线程的。我不确定通过使编译器多线程有什么好处。最耗时的编译阶段是处理所有#include依赖项,并且由于各种标头之间的潜在依赖性,它们具有以顺序处理。其他编译阶段在很大程度上依赖于前几个阶段的输出,因此从并行性中获得的好处几乎没有。

答案 1 :(得分:4)

Gcc具有-flto=n-flto=jobserver以使链接步骤(与LTO进行优化和代码生成)并行。根据文档,这些版本自4.6版本开始提供,但我不确定它们在早期版本中有多好。

答案 2 :(得分:1)

较新的Visual Studio版本可以并行编译不同的翻译单元。如果您的项目使用许多实现文件(例如.c,.cc,.cpp),它会有所帮助。

MSDN Page

答案 3 :(得分:1)

实际上不可能对链接阶段进行多处理。可能存在某种程度的多线程,但它不太可能提升性能。因此,许多构建系统将简单地为单独的文件启动单独的过程。一旦它们全部编译完毕,那么它将会执行一个长的单线程链接。唉,正如我所说,你可以做的很少:(

答案 4 :(得分:1)

多线程编译并不是很有用,因为构建系统(Make,Ninja)会立即启动多个编译单元。 正如Ferrucio所说,并发编译实际上很难实现。

多线程链接虽然有用(并发.o / .a读取和符号解析。),因为这很可能是最后一个构建步骤。

Gnu Gold链接器可以是多线程的,具有LLVM ThinLTO实现: https://clang.llvm.org/docs/ThinLTO.html

答案 5 :(得分:0)

对于Visual C ++,我不知道它是否进行任何并行编译(我不这么认为)。对于Visual Studio 2005之后的版本(即Visual C ++ 8),解决方案中的项目是在解决方案依赖关系图允许的范围内并行构建的。

答案 6 :(得分:0)

Go 1.9编译器声称:

  

并行编译

     

Go编译器现在支持并行编译软件包的功能,利用多个内核。这是对go命令现有的并行编译单独包的支持的补充。

但当然,它编译Go,而不是C ++

即使在2017年10月,我也无法为任何C ++编译器命名。但我想多线程Go编译器表明多线程C或C ++编译器(原则上)是可能的。但他们很少,而且制作新的是huge work,你实际上需要从零开始做这样的努力。