Clo*_*oud 10 msbuild parallel-processing visual-studio-2010 multiprocessing visual-studio
我有一个.sln包含大量项目(~50)的大型Visual Studio 2010解决方案文件().每个项目都包含粗略20 .cpp和.h文件.在快速的Intel i7计算机上构建整个项目大约需要2个小时,所有依赖项都在快速SSD上本地缓存.
我试图复制我在这个主题上发现的现有实验,需要澄清如何:
MSBuild.exe.首先,/m和/maxcpucount选项是一样的吗?我已经阅读了一篇关于该/m选项的文章,该文章似乎并行构建了更多项目.这似乎与我通过GUI中的以下操作设置的选项相同:
Maximum number of parallel project builds还有另一种选择,/MP我可以通过以下方式访问GUI:
Multi-processor Compilation如果我错了,请纠正我,但这似乎表明该项目将.cpp并行构建多个文件,但没有选项指定多少文件,除非我必须在文本框中手动设置它(即:/MP 4或者/MP4.
似乎为了/MP工作,我需要禁用最小重建(即:)Enabled Minimal Rebuild: No (/GM-),它也不适用于预编译的头文件.我已经解决了预编译头文件问题,方法是将预编译头文件作为一个专用项目,该解决方案首先构建在所有其他项目之前.
问题:我如何在解决方案中为并行项目构建实现这些选项,并在项目中构建并行文件(.cpp),通过命令行使用MSBuild,并确认它们按预期工作?我的上述假设是否也正确?我的最终目标是测试构建项目的最多使用的核心总数,或者如果我的构建过程是I/O绑定而不是CPU绑定,甚至可能重载它.我可以在Linux中通过以下方式轻松完成此操作:
NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
NUMJOBS="$(echo "$NUMCPUS*1.5" | bc)"
NUMJOBS="$(printf '%.0f' $NUMJOBS)"
alias pmake='time nice make -j$NUMJOBS'
Run Code Online (Sandbox Code Playgroud)
这允许我在我的8核PC上一次排队12个构建任务,并make自动.cpp并行构建多达12个文件,处理隐式构建规则/依赖项等.我正在尝试在Visual中实现相同的功能Studio Professional和MSBuild.当我的构建受到I/O限制时,这种方法一直是保持所有内核~100%使用的最佳方法.
谢谢.
/MP编译器(cl.exe)的开关和/m选项msbuild.exe确实是要走的路.以下是一些相关的文档摘录:
/ MP选项使编译器创建自身的一个或多个副本,每个副本都在一个单独的进程中.然后这些副本同时编译源文件.可选参数:编译器可以创建的最大进程数.如果省略processMax参数,编译器将从操作系统中检索计算机上的有效处理器数,并为每个处理器创建一个进程./ MP选项与某些编译器选项和语言功能不兼容.如果对/ MP选项使用不兼容的编译器选项,编译器将发出警告D9030并忽略/ MP选项
示例假设您指定以下命令行:
cl/MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
在这种情况下,编译器使用五个进程,因为这是五个源文件中的较小者,最多七个进程.或者,假设您的计算机有两个有效的处理器,并指定以下命令行:
cl/MP a.cpp b.cpp c.cpp
在这种情况下,操作系统报告两个处理器; 因此,编译器在计算中使用两个进程.因此,编译器将使用两个进程执行构建,因为这是两个进程和三个源文件中较小的一个.
所以你注意到这完全是关于编译器的,而且还没有关于msbuild的消息,因为编译器是一个独立的工具.换句话说:假设您打开了2个命令窗口,并且在它们两个同时调用命令cl /MP3 a.cpp b.cpp c.cpp时,您将同时运行6个编译器进程.你正在追求的行为是什么,也是msbuild可以做的事情.
调用输出msbuild /?:
/ maxcpucount [:n]指定要使用的最大并发进程数.如果未使用该开关,则使用的默认值为1.如果使用的开关没有值,则MSBuild将使用最多计算机上的处理器数.(简称:/ m [:n])
此处还有更多相关信息,特别是它所说的部分
BuildInParallel是MSBuild任务上的可选布尔参数.当BuildInParallel设置为true(其默认值)时,将生成多个工作进程以同时构建任意数量的项目.为使其正常工作,必须将/ maxcpucount开关设置为大于1的值,并且系统必须至少为双核或具有两个或更多处理器.
现在,如果你只是打电话msbuild /m my.vcxproj给一个典型的项目,这将不会做任何特别的事情,因为只有一个项目要建立.但是如果在msbuild文件中有一个对MsBuild任务的调用,比如
<MsBuild Projects="@(ListOfProjects)" BuildInParallel="True"/>
Run Code Online (Sandbox Code Playgroud)
并且/m选项被传递给msbuild,然后msbuild将根据上面列出的规则生成多个其他msbuild进程.巧合的是,这正是使用msbuild构建解决方案时所发生的情况.Msbuild首先将解决方案转换为实际的msbuild文件,该文件使用解决方案中的项目列表调用MsBuild任务.因此,可以并行构建多个项目,并为此创建多个msbuild进程.反过来,如果这些是设置了/ MP选项的C++项目,那么每个项目都将创建多个编译器进程,从而产生最多的<max num cl processes> * <max num msbuild instances>并行编译.这取决于您的构建机器什么是最佳,如果您希望您可以使用选项(为了有效地执行此操作,您的每个项目将导入一个公共属性表,您在其中设置/ MP选项,否则您必须编辑所有这些都是单独的)并查看msbuild在构建完成时报告的时间.我总是将/ m和/ MP的参数保留为默认值,因为我不希望使用我的项目的其他开发人员可能具有可能的次优配置,并且因为它很容易使CPU最大化.
您可以通过调用以下命令在命令行上实现此目的:
MSBuild /m:PARALLEL_PROJECT_COUNT /p:CL_MPCount=PARALLEL_FILE_COUNT
Run Code Online (Sandbox Code Playgroud)
结果进程的数量将是:
MSBuild = PARALLEL_PROJECT_COUNT
Cl =PARALLEL_PROJECT_COUNT * PARALLEL_FILE_COUNT
| 归档时间: |
|
| 查看次数: |
5259 次 |
| 最近记录: |