29

在 Visual Studio for C++ 项目中使用“多处理器编译”选项时,我应该注意哪些缺点、副作用或其他问题?或者,换一种说法,为什么这个选项在 Visual Studio 中默认是关闭的?

4

4 回答 4

21

的文档/MP

不兼容的选项和语言功能
/MP选项与某些编译器选项和语言功能不兼容。如果您将不兼容的编译器选项与该/MP选项一起使用,编译器会发出警告 D9030 并忽略该/MP选项。如果您使用不兼容的语言功能,编译器会发出错误 C2813,然后根据当前编译器警告级别选项结束或继续。
注意:
大多数选项是不兼容的,因为如果它们被允许,并发执行的编译器会同时将它们的输出写入控制台或特定文件。结果,输出将混合并出现乱码。在某些情况下,选项的组合会使性能变差。

它提供了一个表格,列出了与以下内容不兼容的编译器选项和语言功能/MP

  • #import预处理指令(将类型库中的类型转换为 C++ 类,然后将这些类写入头文件)
  • /E, /EP(将预处理器输出复制到标准输出(stdout))
  • /Gm(启用增量重建)
  • /showIncludes(将包含文件列表写入标准错误(stderr))
  • /Yc(写一个预编译的头文件)

Visual Studio不是默认禁用这些其他选项(并默认启用/MP),而是让您手动禁用/阻止这些功能并启用/MP.

于 2012-12-20T20:47:16.857 回答
12

根据我们的经验,发现的主要问题是:

  1. 由于多个项目同时调用 bscmake,浏览信息无法构建(现在无用的信息,因此应作为项目设置删除)
  2. 由于依赖问题和构建顺序问题导致的链接器失败,在正常构建时通常不会看到
  3. 批量构建不利用多处理器编译,至少 2005-2008 VS 版本确实如此
  4. 生成的关于预编译头不兼容的警告,当您构建 stdafx 时会发生这种情况并且可以忽略,但是在进行重建时会生成此消息

但是,以上是您可以解决的配置问题,否则应该启用它,因为它会加快构建速度。

于 2012-12-20T20:45:48.290 回答
6

因为多处理器编译与许多其他编译选项不兼容,并且还具有更高的系统资源使用率。应该由开发商来决定对他来说是否值得。您可以在此处找到完整的文档:http: //msdn.microsoft.com/en-us/library/bb385193.aspx

于 2012-12-20T20:44:44.670 回答
0

虽然使用/MP会给编译速度带来一些好处,但由于工作负载的调度方式,仍有一些性能留在桌面上:https ://randomascii.wordpress.com/2014/03/22/make-vc-compiles-快速并行编译/

编译器以“批次”的形式接收作业(一组传递给编译器的源文件),并且只有在前一个批次完成后才会开始下一个批次。这意味着在编译最长的翻译单元之前,其他内核上还有未使用的周期。编译器子进程之间没有数据共享。

为了进一步提高多核的利用率,我建议切换到ninja. 我已经在几个项目中实现了它,它总是一个胜利,例如https://github.com/openblack/openblack/pull/68#issuecomment-529172980

于 2021-08-11T19:52:48.430 回答