VS2019: 有关并行编译的优化

VS2019: 有关并行编译的优化

作者:BlogUpdater |  时间:2020-02-15 |  浏览:168 |  评论已关闭 条评论

所谓的并行编译
从Visual Studio 2019 v16.3开始,我们就一直在添加新的功能特性来优化并行编译这个组件。因为这些特性目前还是处于实验状态,所以它们在默认情况下是关闭的。当为Android平台开发工具的时候,我们将clang/gcc到引入到了MSBuild平台。Clang/gcc依赖于编译系统的并发模型,但是,不凑巧的是,MSBuild只能在项目级进行并发编译。为了解决这个问题,我们创建了一项新的MSBuild任务,也就是所谓的Multi-ToolTask (MTT)。这项新任务不再使用MSBuild的批处理系统,并绕开了典型的单任务的限制。有了这个玩意,就可以以并行的方式来执行各个任务,同时还可以集成其他的未包含在MSBuild中的调度模块。在这一版本中,我们在一些现有的Vcxproj编译任务里使用到了MTT,任务可以更多的并行执行,由此我们提升了编译速度。

让我们从这里开始吧!
MTT是一个可选项,它可以通过设置MSBuild属性或者环境变量[UseMultiToolTask]为[true]来启用。不管是MTT被启用还是被禁用,它的使用对于日常开发活动来说是透明的,而且它全方位的支持IDE模式和命令行模式下的增量编译。你可以通过设置环境变量或者在帮助文档的[Customize your build]页面来设置这一属性。为了达到最佳工作状态,建议将这一属性设置到一个解决方案中的所有工程。

为什么使用MTT?
当MTT被启用时,MTT将使用它内建的一套调度机制来控制它的吞吐量。通过将[EnforceProcessCountAcrossBuilds]设置为[true],可以控制MTT在跨多个工程和MSBuild实例时使用到的处理器数量。这一特性可以用来对抗服务器资源超购时带来的性能下降和内存限制。对于其他属性的控制,可以通过将[MultiProcMaxCount]或者[CL_MPCount]这两个属性设置为Job的最大数量来实现。[CL_MPCount]这一属性是由IDE来设置的(路径:[Tools > Options > Projects and Solutions > Maximum Concurrent C++ Compilations])。在默认情况下,[MultiProcMaxCount]和[CL_MPCount]的值被设置为系统中逻辑处理器的数量。

最后,对每个项目的元数据属性[MultiToolTaskDependency]的设置可以在相同的MTT实例中创建一个对另一个项目的依赖。举个例子:在我们项目中,我们编译CPP源文件并首先生成PCH文件,然后编译依赖这个源文件的其他文件。在MTT中,可以通过某种方式来描述这一依赖,同时调度器可以识别这种依赖性并对它们的顺序进行处理。通过对依赖性的描述,可以解除源文件对PCH的依赖,这样编译源文件时就不在需要额外的等待过程,这样就有机会来实现更多的并行性。

由此带来的性能提升和代码规模有关,更多的信息可以参考Kevin写的文章[use xperf to measure your performence]。在这一版本中,MTT仅被编码到了MIDL, CL, Clang和FXC(hlsl)的并行中。如果你的工程使用到了自定义编译工具,则可以通过点击[Parallel Custom Build Tools]来实现适配,如果你觉得有其他的工具很有用,也可以反馈给我们。

总结
我的项目还不是很大,编起来也就几十分钟,大概,还用不上这么个东西。
但是,感谢开发团队给我们带来这个好玩意。

标签:

评论已关闭。