Visual Studio中的“多处理器编译”有什么缺点吗?

时间:2012-12-20 20:38:45

标签: c++ visual-studio compilation multiprocessing

在Visual Studio for C ++项目中使用“多处理器编译”选项时,我应该注意哪些缺点,副作用或其他问题?或者,用另一种方式表达问题,为什么在Visual Studio中默认关闭此选项?

4 个答案:

答案 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)

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

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

答案 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