提高MSBuild的并行性

从visualstudio201916.3开始,我们一直在添加一些特性来提高构建并行性。这些功能仍处于试验阶段,因此默认情况下处于关闭状态。在为Android开发工具时,我们将clang/gcc引入MSBuild平台。Clang/gcc依赖于构建系统的并行模型,但是MSBuild只在项目级别进行并行。这导致了将Multi-ToolTask(MTT)创建为MSBuild任务。它放弃了MSBuild批处理系统,并围绕典型的单任务限制工作。这允许任务并行执行,并使用MSBuild中不存在的其他调度功能。在这个版本中,我们将MTT用于一些现有的Vcxproj构建任务,使现有任务更加并行,从而提高构建吞吐量。

null

入门

通过设置MSBuild属性或环境变量,MTT可以是“opt-in” 使用MultiTool任务 是真的。在开发人员的日常工作流程中,它的使用应该是透明的,并且它完全支持IDE和命令行中的增量构建,即使在打开和关闭MTT时也是如此。要设置属性,可以将其设置为环境变量或按照中的说明进行操作 自定义您的版本 . 为了获得最佳效果,请将这些属性应用于解决方案中的所有项目。

为什么使用MTT?

启用时,MTT使用其内置的调度器,该调度器支持一些功能来控制其吞吐量。通过设置属性 强制ProcessCountAcrossBuilds 为true,这将限制MTT跨多个项目和MSBuild实例使用的最大进程数。这个特性应该有助于克服由过度订阅带来的速度减慢和内存限制。要获得额外的控制,请使用 多进程最大计数 氯离子计数 属性来定义最大作业数。 氯离子计数 属性由IDE(工具>选项>项目和解决方案>最大并发C++编译)设置。默认情况下, 多进程最大计数 氯离子计数 值等于CPU逻辑处理器的数量。

最后,设置元数据 多工具任务相关性 将在同一MTT实例中创建对另一项的依赖关系。例如,在我们的项目系统中,我们首先构建.cpp源文件来生成PCH,然后构建它们的使用者。在MTT中,可以描述这种依赖关系,调度器将处理订单。通过依赖关系描述,它允许不依赖于PCH的.cpp在不等待的情况下运行,从而打开更多的并行机会。

性能增益将因来源而异。凯文写这个博客是为了 用xperf来衡量你的表现。 在这个版本中,MTT只编码为并行化MIDL、CL、Clang和FXC(hlsl)。  如果您的项目正在使用自定义生成工具,则启用 并行自定义生成工具 点击几下。  如果有其他工具,你认为可以受益,给我们反馈。

向我们发送反馈

这个特性仍处于试验阶段,因此我们仍在寻找改进它的方法。告诉我们您的经验是什么,或者建议改进系统的方法。我们的重点是正确性、渐进性和可伸缩性。请在下面留言或发邮件给我们visualcpp@microsoft.com.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享