您的位置: 首页 > 技术文档 > 网络编程 > C++项目在VS2010中的并行构建调优
ASP.NET 4中的SEO改进 回到列表 ASP.NET中创建GeoRSS订阅源
 C++项目在VS2010中的并行构建调优

作者:黄永兵 时间: 2010-03-29 文档类型:原创 来自:蓝色理想

在多处理器计算机上提高构建速度的一个极好方法是充分利用其并行处理能力,如果你在Visual Studio 2010中有一个C++项目,有两种不同类型的并行构建配置方法供你选择。

有哪些参数可以调整?

项目级并行构建是由MSBuild控制的,它是在Visual Studio的解决方案级进行设置的(实际上Visual Studio是为每个用户都保存了设置,与你想象的可能有点不一样,你可能认为不同解决方案有不同的设置,但UI却不允许你这么做),默认情况 下,Visual Studio选取你机器上的处理器数量作为最大并行构建项目的数量,如图1所示,你可以将这个数字调大调小找出一个并行构建速度最快的合适值,有些人可能 喜欢将其调小,以便在构建期间还可以做点其它工作。

并行构建项目

图 1 并行构建项目的最大数量

虽然MSBuild从Visual Studio接管了部分功能,但这里的设置仍然保持和Visual Studio 2008一样。

如果你正在构建C++或 C++/CLI项目,还有一个地方你可以设置并行构建参数,CL编译器支持/MP参数,它告诉编译器使用自身的一个单独实例同时构建它的子集,默认的并行 数仍然使用了CPU的数量,但你可以指定一个值,如/MP5,注意现在情况发生了一点变化,因此我要告诉你如何找到这个值,以及在MSBuild格式项目 文件中看起来是什么样子。

打开项目的“属性”窗口,转到“C/C++”*“常规”窗口,我建议你选择“所有配置”和“所有平台”,在后面你才有更多的可选项。

项目属性设置

图 2 项目属性设置

象往常一样,通过转储,你可以看到项目文件中有什么内容,在“解决方案资源管理器”中的节点上点击右键,选择“编辑”。

编辑节点属性

图 3

下图显示了项目文件的一部分代码。

项目文件代码示例

图 4 项目文件代码示例

在这里,所有类型为“ClCompile”的项目都自动拥有元数据MultiProcessorCompilation,默认值为true,除非明 确指定了一个不同的值。

顺便说一下,MSBuild项目通常都是一个文件,它们的子元素是元数据,下面是一个例子,注意它们被放在一个“ItemGroup”中。

MSBuild项目文件示例

图 5 MSBuild项目文件示例

因为这是一个元数据,如果是高手,完全可以直接修改每个文件,你需要为使用了#import的文件禁用/MP,因为它不支持/MP,其它不支持 /MP的特性是/Gm,/Gm表示渐进式编译,更多参数请参考http://msdn.microsoft.com/en-us/library /bb385193.aspx。

回到多处理器CL,如果你想明确告诉CL有多少并行编译执行,Visual Studio可通过/MP实现,它出现在全局设置中。

C++编译最大并行任务数设置

图 6 C++编译最大并行任务数设置

Visual Studio通过一个全局属性CL_MPCount进行设置,这意味着在Visual Studio外构建时将不受任何影响。

如果你选择一个更细粒度的值,你就不能使用图形界面进行设置了,因为你根本看不到它的设置项,这时就必须打开项目文件直接进行修改。在 CLICompile项目上这是一个完全不同的元数据块,叫做“ProcessorNumber”,你可以设定一个从1到你认为合理的一个值,然后在 /MP后也追加一个同样的值,如果没有<MultiProcessorCompilation>,它就会被忽略。

ProcessorNumber和MultiProcessorCompilation设置

图 7 ProcessorNumber和MultiProcessorCompilation设置

图中出现的波浪线是一个小小的bug,直接忽略它。

如何在命令行上构建?

/MP设置来自项目文件,因此在命令行上进行设置作用是一样的,它是整个MSBuild的一部分,在命令行上构建和在Visual Studio中构建是一样的效果吗?在Visual Studio中设置的全局并行设置不会影响到命令行,你必须亲自给msbuild.exe传递/m参数,这个参数是可选的,如果你不设置,它就使用CPU 的数量,但和Visual Studio开箱即用的特性不一样,在命令行中如果不指定/m参数,它只会使用1颗CPU,这个问题可能在将来的版本中会得到修正。

命令行构建参数

图 8 命令行构建参数

如果想给/MP选任意的值,你可以设置一个环境变量,或象Visual Studio那样传递一个属性CL_MPCount。

在每个项目上都设置/MP是很烦人的,怎么才能提高设置效率?

你可能想在多个项目上使用/MP,但你又不想在每个项目上都设置一遍,Visual Studio解决这类问题的办法是使用属性表。首先从“视图” 菜单打开“属性管理器”,根据你使用的设置它的确切位置可能不一样,下面是一个C++项目设 置的位置。

视图菜单中的属性管理器

图 9 视图菜单中的属性管理器

在一个项目上点击右键,选择“添加新的属性表”:

给项目添加新的属性表

图 10 给项目添加新的属性表

我给它取了一个名字叫做“MultiprocCpp.props”,你将会看到该项目的所有配置都将添加这个属性表,在它上面点击右键,你将看到与 项目相同的属性窗口,但这个时候你编辑的是属性表,再次将“Multi-processor Compilation”设为“YES”。关闭属性窗口,在属性管理器中选择属性表,然后点击“保存”。

现在可以在编辑器中打开新建的MultiprocCpp.props文件,我的看起来如下:

在编辑器中打开MultiprocCpp.props

图 11 在编辑器中打开MultiprocCpp.props

仔细查看这个项目文件,你可以看到属性表通过一个Import标签应用到每个配置中了,这一点和C++中的#include非常类似。

通过Import引用属性表

图 12 通过Import引用属性表

现在我们就可以重用之前在项目文件中的定义了,于是我可以在属性管理器中选中多个项目,然后点击右键,选择“添加现有属性表”。

为多个项目同时指定属性表

图 13 为多个项目同时指定属性表

OK!现在所有项目编译时都带有/MP参数了。

在某些情况下,你可能想要更简单一点,例如,你可能想要删除大量的属性表,幸运的是,MSBuild 4.0有一个强大的,完整的对象模型,你可以使用它,再编写几行代码就可以搞定这种工作了。

如果你不想通过图形界面进行设置,完全可以自己手动进行编辑,例如,在VS自己的构建中,我们在每个项目的顶级都设置了一套属性。

手动设置项目顶级属性

图 14 手动设置项目顶级属性

在这里我们定义了所有类型的全局设置,并导入了其它设置,我将在以后的文章中介绍组织大型构建树的方法。

并行数量太多了也不好

一般来说,利用完所有处理器或处理器核心就已经足够了,否则可能会导致机器变慢甚至崩溃,下图就显示了这样一个例子。

太多的并行构建进程很容易让机器崩溃

图 15 太多的并行构建进程很容易让机器崩溃

我是在一台8 CPU的机器上做的这个实验,我把解决方案中的所有项目全部开启/MP了,然后使用msbuild.exe /m进行构建(我使用命令行进行构建不会出现这个问题,但在Visual Studio中进行构建就会出现),如果相关依赖不能阻止它,MSBuild将立即启动8个项目,每个CL将会一次运行自己的8个实例,因此总共会有64 个CL运行考验我们的处理器核心和磁盘,这样做不但不能提升速度,反倒会使性能急剧下降。

你可能希望有一天系统能够实现自我调整,但如果现在遇到这样的问题,你不得不手工调整。下面是一些建议

  • 将全局值设小一点
    例如将/m:4减少到/m:3,或使用属性表将/MP修改为/MP2,如果你的构建中还有其它问题,如有许多的并行项目,但并行的CL不够,反之亦 然,这个时候你都应该将全局并行构建参数调小。
  • 为每个项目和配置调整/MP
    有些时候使用/MP可能不是最佳的办法,你也可以通过配置进行调整,Retail配置可能会使速度变得更慢,因为编译器要做的优化更多了,为 Retail开启/MP而不是为Debug开启/MP可能更有意义。
  • 获得超级定制
    在你的团队中,你可能有一系列硬件,也许你的开发人员使用的是双CPU机器,但夜间构建是在一台8 CPU的机器上进行的,两者构建时需要的来源是一样的,你希望两者的速度都不能太慢,在这种情况下,你可以使用环境变量,或是在MSBuild标签上设置 条件,几乎所有MSBuild标签都可以设置条件。

下面是一个例子,当“MultiprocCLCount”有一个大于零的值时,就可以使用这个值启用/MP。

通过环境变量调整处理器数量 

图 16 通过环境变量调整处理器数量(点击上图可放大)

MSBuild启动时将所有环境变量的值作为初始属性值,因此在我更快速的机器上,我将MultiprocCLCount的值设为8,而在我的开发 用机上,我将其设为2。

类似的方法还可以应用到MSBuild.exe的/m参数中,如/m:%MultiprocMSBuildCount%,

在外来条件中还有其它属性可能很有用,如$(Number_Of_Processors)表示逻辑处理核心数量,它来自环境变 量。$(MSBuildNodeCount)是传递给msbuild.exe /m参数的值,在Visual Studio中,这个值是通过“工具”*“选项”进行设置的。

最后,我希望你能有效利用/m和/MP。希望你对我介绍的MSBuild功能能进一步深入学习,最好自己动手配置一次。

本文链接:http://www.blueidea.com/tech/program/2010/7339.asp 

欢迎访问微软官网下载相关软件http://www.microsoft.com/zh/cn/default.aspx

出处:蓝色理想
责任编辑:bluehearts

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
ASP.NET页面间数据传递的方法
ASP.NET 4中的SEO改进
ASP.NET中创建GeoRSS订阅源
ASP.NET实现类似Excel的数据透视表
ASP.NET 与 PHP 正面交锋
作者文章 更多作者文章
ASP.NET中创建GeoRSS订阅源
详解 VS 2010中WF 4.0的应用
创意设计欣赏
俄罗斯设计师RSS图标设计
重新发现HTML表格
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
悟道web标准:前端性能优化
纯中文域名".中国"今日提交申请
世界之窗3.0皮肤设计大赛结果公布
使用jQuery制作滑动动画效果的层
如何设计网页横幅
Plump 图标设计
Subrat Nayak图标设计
百度知道推出文档分享服务
CSS Sprites(CSS雪碧):要还是不要?
UIRSS三周年纪念日推出V2公测版
栏目最新 栏目最新列表
Firefox的Jetpack扩展案例分析
阿里妈妈UED谈CSS Sprites技术
Photoshop中设计绿色时尚Web网站
操作Dom节点实现间歇滚动新闻
浏览器15年历史回顾
如何创建Firefox的Jetpack扩展
全透视:CSS Z-index 属性
用PS 3D工具绘制甜麦圈包装袋
悟道Web标准:让W3C标准兼容终端
悟道WEB标准:统一思想,遵循标准

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

本文暂时没有评论和评分

您的评论
用户名: moby
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
《Web标准设计》
闪魂-FlashCS4完美入门与案例精粹
Waver_h's华丽世界
Illustrator CS3质感绘画表现技法
《Flash短片轻松学》
《用户体验要素》
《JavaScript语言精粹》
作品集 更多内容

鑫华昌地板改版首页 西关迟暮·恩宁路 一个国学院的页面 西关迟暮·恩宁路 腐败夫妻志之愚人节之 某地产形象动画 腐败夫妻志之愚人节之