在 Visual Studio for C++ 项目中使用“多处理器编译”选项时,我应该注意哪些缺点、副作用或其他问题?或者,换一种说法,为什么这个选项在 Visual Studio 中默认是关闭的?
4 回答
不兼容的选项和语言功能
该/MP
选项与某些编译器选项和语言功能不兼容。如果您将不兼容的编译器选项与该/MP
选项一起使用,编译器会发出警告 D9030 并忽略该/MP
选项。如果您使用不兼容的语言功能,编译器会发出错误 C2813,然后根据当前编译器警告级别选项结束或继续。
注意:
大多数选项是不兼容的,因为如果它们被允许,并发执行的编译器会同时将它们的输出写入控制台或特定文件。结果,输出将混合并出现乱码。在某些情况下,选项的组合会使性能变差。
它提供了一个表格,列出了与以下内容不兼容的编译器选项和语言功能/MP
:
#import
预处理指令(将类型库中的类型转换为 C++ 类,然后将这些类写入头文件)/E
,/EP
(将预处理器输出复制到标准输出(stdout))/Gm
(启用增量重建)/showIncludes
(将包含文件列表写入标准错误(stderr))/Yc
(写一个预编译的头文件)
Visual Studio不是默认禁用这些其他选项(并默认启用/MP
),而是让您手动禁用/阻止这些功能并启用/MP
.
根据我们的经验,发现的主要问题是:
- 由于多个项目同时调用 bscmake,浏览信息无法构建(现在无用的信息,因此应作为项目设置删除)
- 由于依赖问题和构建顺序问题导致的链接器失败,在正常构建时通常不会看到
- 批量构建不利用多处理器编译,至少 2005-2008 VS 版本确实如此
- 生成的关于预编译头不兼容的警告,当您构建 stdafx 时会发生这种情况并且可以忽略,但是在进行重建时会生成此消息
但是,以上是您可以解决的配置问题,否则应该启用它,因为它会加快构建速度。
因为多处理器编译与许多其他编译选项不兼容,并且还具有更高的系统资源使用率。应该由开发商来决定对他来说是否值得。您可以在此处找到完整的文档:http: //msdn.microsoft.com/en-us/library/bb385193.aspx
虽然使用/MP
会给编译速度带来一些好处,但由于工作负载的调度方式,仍有一些性能留在桌面上:https ://randomascii.wordpress.com/2014/03/22/make-vc-compiles-快速并行编译/
编译器以“批次”的形式接收作业(一组传递给编译器的源文件),并且只有在前一个批次完成后才会开始下一个批次。这意味着在编译最长的翻译单元之前,其他内核上还有未使用的周期。编译器子进程之间没有数据共享。
为了进一步提高多核的利用率,我建议切换到ninja
. 我已经在几个项目中实现了它,它总是一个胜利,例如https://github.com/openblack/openblack/pull/68#issuecomment-529172980