在Visual Studio中"multi-processor compilation"有什么缺点吗?
Are there any disadvantages to "multi-processor compilation" in Visual Studio?
在Visual Studio中为c++项目使用"多处理器编译"选项时,是否有任何缺点,副作用或其他问题我应该注意?或者,用另一种方式来表达这个问题,为什么在Visual Studio中这个选项默认是关闭的?
/MP
的文档说:
不兼容的选项和语言特性
/MP
选项与某些编译器选项和语言特性不兼容。如果您使用与/MP
选项不兼容的编译器选项,则编译器会发出警告D9030并忽略/MP
选项。如果您使用不兼容的语言特性,编译器会发出错误c2813,然后根据当前编译器警告级别选项结束或继续。
注意:
大多数选项是不兼容的,因为如果允许,并发执行的编译器会同时将它们的输出写入控制台或特定文件。其结果是,输出将混杂和乱码。在某些情况下,选项的组合会使性能变差。
它给出了一个表,列出了与/MP
不兼容的编译器选项和语言特性:
#import
预处理器指令(将类型库中的类型转换为c++类,然后将这些类写入头文件)/E
,/EP
(将预处理器输出拷贝到标准输出(stdout))/Gm
(启用增量重建)/showIncludes
(将包含文件列表写入标准错误(stderr))/Yc
(写入预编译头文件)
与默认禁用其他选项(默认启用/MP
)不同,Visual Studio让您手动禁用/阻止这些功能并启用/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-fast-through-parallel-compilation/
编译器以"批处理"方式接收作业。(传递给编译器的一组源文件),并且只有在前一批完成后才开始下一批。这意味着在编译最长的翻译单元之前,其他内核上有未使用的周期。编译器子进程之间不共享数据。
为了进一步提高多核的利用率,我建议切换到ninja
。我已经在几个项目中实现了它,它总是一个胜利,例如https://github.com/openblack/openblack/pull/68#issuecomment-529172980
- 使用rdtsc进行基准测试的缺点是什么
- 提供运算符+或运算符到双向迭代器有什么缺点吗?
- std::atomic_flag不提供加载或存储操作有什么缺点吗?(自旋锁定示例)
- 将字段(在类中)定义为引用的缺点是什么?
- 嵌套向量的缺点是什么?
- 守护进程()有什么缺点吗?
- 不必要的 else 语句:当可以使用 IF 时,使用 ELSE IF 有什么缺点吗?
- 使用使用"extern "C""的 C 库与使用本机C++库有什么缺点?
- pImpl习语-将私有类实现放在cpp中有什么缺点
- 如果我使用数组而不是矢量,有什么缺点吗?
- 使用'?'而不是L'?wchar_t'有什么缺点吗?
- 将size_t转换为长,有什么缺点吗?
- 将包含单个数组的结构声明为packed有什么缺点吗
- 在 Objective-C 中使用 C++ 作为常量有什么缺点吗?
- 使用ctime的tzset有什么缺点?
- 定义一个像 Python "with" 语句一样工作的 C 宏有什么缺点?
- std::get_temporary_buffer和std::raw_storage_iterator有什么缺点吗?
- 标记所有不修改 const 的变量有什么缺点吗?
- 与&&运算符相比,使用"and"运算符有什么缺点吗?
- 在Visual Studio中"multi-processor compilation"有什么缺点吗?