在Visual Studio for C ++项目中使用“多处理器编译”选项时,我应该注意哪些缺点,副作用或其他问题?或者,用另一种方式表达问题,为什么在Visual Studio中默认关闭此选项?
答案 0 :(得分:17)
The documentation for /MP
says:
不兼容的选项和语言功能
/MP
选项与某些编译器选项和语言功能不兼容。如果使用带有/MP
选项的不兼容编译器选项,编译器将发出警告D9030并忽略/MP
选项。如果使用不兼容的语言功能,编译器会发出错误C2813结束或继续,具体取决于当前编译器警告级别选项。
注意:强>
大多数选项都是不兼容的,因为如果它们被允许,并发执行的编译器会将它们的输出同时写入控制台或特定文件。结果,输出将混合并出现乱码。在某些情况下,选项的组合会使性能变差。
它提供了一个表格,列出了与/MP
不兼容的编译器选项和语言功能:
#import
预处理程序指令(将类型库中的类型转换为C ++类,然后将这些类写入头文件)/E
,/EP
(将预处理器输出复制到标准输出(stdout))/Gm
(启用增量重建)/showIncludes
(将包含文件列表写入标准错误(stderr))/Yc
(写一个预编译的头文件)
默认情况下,Visual Studio允许您手动禁用/阻止这些功能并启用/MP
,而不是默认禁用其他选项(并默认启用/MP
)。
答案 1 :(得分:10)
根据我们的经验,发现的主要问题是:
但是,以上是您可以解决的配置问题,否则应启用它,因为它会加快构建。
答案 2 :(得分:6)
因为多处理器编译与许多其他编译选项不兼容,并且还具有更高的系统资源使用率。应由开发人员决定是否值得他。您可以在此处找到完整的文档:http://msdn.microsoft.com/en-us/library/bb385193.aspx
答案 3 :(得分:0)
虽然使用 /MP
会为编译速度带来一些好处,但由于工作负载的调度方式,表中仍然存在一些性能问题:https://randomascii.wordpress.com/2014/03/22/make-vc-compiles-fast-through-parallel-compilation/
编译器以“批次”(一组传递给编译器的源文件)接收作业,并且仅在前一个批次完成后才开始下一个批次。这意味着在编译最长的翻译单元之前,其他内核上仍有未使用的周期。编译器子进程之间没有数据共享。
为了进一步提高多核的利用率,我建议改用 ninja
。我已经在几个项目中实现了它,并且它总是成功的,例如https://github.com/openblack/openblack/pull/68#issuecomment-529172980