现在几乎每个用户在桌面(以及大量笔记本电脑)上都有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?
编译器的线程数是否有一些上限,这是多线程的?
谢谢!
答案 0 :(得分:5)
某些构建系统可以并行编译独立的模块,但编译器本身仍然是单线程的。我不确定通过使编译器多线程有什么好处。最耗时的编译阶段是处理所有#include依赖项,并且由于各种标头之间的潜在依赖性,它们具有以顺序处理。其他编译阶段在很大程度上依赖于前几个阶段的输出,因此从并行性中获得的好处几乎没有。
答案 1 :(得分:4)
Gcc具有-flto=n
或-flto=jobserver
以使链接步骤(与LTO进行优化和代码生成)并行。根据文档,这些版本自4.6版本开始提供,但我不确定它们在早期版本中有多好。
答案 2 :(得分:1)
较新的Visual Studio版本可以并行编译不同的翻译单元。如果您的项目使用许多实现文件(例如.c,.cc,.cpp),它会有所帮助。
答案 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)