Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪个x86c++;编译器本身是多线程的?_C++_Multithreading_Compiler Construction - Fatal编程技术网

C++ 哪个x86c++;编译器本身是多线程的?

C++ 哪个x86c++;编译器本身是多线程的?,c++,multithreading,compiler-construction,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/CLAN,Sun编译器,MSVC,OpenWATCOM,PATSION,PG

现在几乎每个用户都有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/CLAN,Sun编译器,MSVC,OpenWATCOM,PATSION,PGI,TenDRA,数字MARS?p> 多线程编译器的线程数是否有更高的限制


谢谢 < P>一些构建系统可以并行编译独立的模块,但是编译器本身仍然是单线程的。我不确定让编译器多线程化会有什么好处。最耗时的编译阶段是处理所有的#include依赖项,它们必须按顺序处理,因为不同头之间可能存在依赖项。其他编译阶段严重依赖于以前阶段的输出,因此并行性几乎没有什么好处。

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


实际上不可能对链接阶段进行多处理。可能会有某种程度的多线程,但不太可能给性能带来很大提升。因此,许多构建系统只需为单独的文件启动单独的进程。一旦它们都被编译好了,它就会,正如你所注意到的,执行一个长的单线程链接。唉,正如我所说,您对此几乎无能为力:(

多线程编译并不是真正有用的,因为构建系统(Make,Ninja)将同时启动多个编译单元。 正如费鲁西奥所说,并发编译确实很难实现

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


Gnu Gold linker可以是多线程的,使用LLVM ThinLTO实现:

Gcc有或
-flto=jobserver
使链接步骤(使用LTO进行优化和代码生成)并行。根据文档,这些步骤从版本4.6开始就可用,尽管我不确定在早期版本中有多好。

编译器声称:

并行编译

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

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


我不能说出任何C++编译器都在做同样的事情,即使在2017年10月。但是我猜想多线程GO编译器显示多线程C或C++编译器是(原则上)。可能。但它们很少,而且制作新的是一项艰巨的任务,您实际上需要从头开始这项工作。

正如您所说,解决方案中的各个项目是并行编译的。单个项目是在单个核心上单线程编译的。链接步骤是单线程的。哪个版本在VisualC++编译器中,这是指我不知道在一个项目中是否支持并行编译。它类似于代码> -j-n>代码>解决方案,所以它不是一个回答2008和2010支持并行编译。检查链接。链接检查。页面称“进程”不是“线程”。。此外,它将在不同的文件上执行并行工作。是的,只有当您的项目有许多翻译单元时,它才有帮助。链接和更高级别的优化仍然是串行的。最耗时的是高级别(O2,O3)的优化还有-ipo优化。代码生成和全局优化也需要花费大量时间,而且可以并行完成。难道不能让多线程程序按顺序建立包含依赖项的线程安全队列吗?你的答案没有多大意义。“最耗时的编译阶段是处理所有的包含依赖项”——你能支持这个请求(例如通过一些论文或基准)吗?在我的经验中,许多C++代码库主要由模板重代码(源于Boost或其他地方)。其他编译阶段严重依赖于前几个阶段的输出”-不完全如此,例如GCC LTO设法部分并行编译。链接阶段相当小(就时间而言)在大型项目中,如果使用
-O3
甚至
-ipo
-whole-program-combined
模式。例如,mysql中有一个文件,使用gcc编译该文件可能长达数小时。这是一个SQL解析器,一个1 MB大小的文件。它的链接时间很短,但优化时间很长。IIRC随附的链接器e Digitalmars C/C++编译器是多线程的(并且是用ASM编写的!),其最终效果是成为世界上速度最快的链接器之一。它可能不会提供线性加速,但它可以很好地缩短大型构建的几分钟时间。Linux是多线程的(并且制作多线程链接器比制作多线程编译器困难得多…)@BasileStarynkevitch注意到Gold的作者报道。我想知道是否有更多的最新基准…从哪个版本开始?记录在哪里?如果是真的,and-flto可能比-flto=n更好(或者只是不同?@osgx I a