MSBuild - 如何并行构建多个文件和项目

时间:2015-11-18 17:57:20

标签: visual-studio visual-studio-2010 parallel-processing msbuild multiprocessing

我有一个包含大量项目(.sln)的大型Visual Studio 2010解决方案文件(~50)。每个项目都包含大约20 .cpp.h个文件。在快速的英特尔i7计算机上构建整个项目大约需要2个小时,所有依赖项都在快速SSD上本地缓存。

我正在尝试replicate an existing experiment I found on this topic,并需要澄清如何:

  1. 获取并行化我正在寻求在Visual Studio中工作(使用GUI / IDE)。
  2. 通过MSBuild.exe
  3. 获取这些更改也可以使用自动命令行构建

    首先,/m/maxcpucount选项是否相同?我read an article on the /m option,似乎并行构建了更多项目。这似乎与我通过GUI中的以下操作设置的选项相同:

    • 工具
      • 选项
      • 项目和解决方案
      • 构建并运行
        • Maximum number of parallel project builds

    还有另一个选项/MP,我可以通过以下方式访问GUI:

    • 项目
      • 属性
      • 配置属性
      • C / C ++
        • 一般
        • Multi-processor Compilation

    如果我错了,请纠正我,但这似乎表明该项目将并行构建多个.cpp文件,但除非我必须手动设置,否则无法指定多少/MP 4个文件在文本框中(例如:/MP4/MP

    似乎为了使Enabled Minimal Rebuild: No (/GM-)起作用,我需要禁用最小重建(即:.cpp),并且它也不适用于预编译的头文件。我已经解决了预编译的头文件问题,它使预编译的头文件成为解决方案首先构建的专用项目,然后是所有其他项目。

    问题:如何在解决方案中为并行项目构建实现这些选项,并在项目中构建并行文件(NUMCPUS=`grep -c '^processor' /proc/cpuinfo` NUMJOBS="$(echo "$NUMCPUS*1.5" | bc)" NUMJOBS="$(printf '%.0f' $NUMJOBS)" alias pmake='time nice make -j$NUMJOBS' ),通过命令行使用MSBuild,并确认它们正在工作正如所料?我的上述假设是否也正确? 我的最终目标是测试构建项目的最多使用的核心总数,或者如果我的构建过程是I / O绑定而不是CPU绑定,甚至可能超载它。我可以这样做在Linux中很容易通过:

    make

    这允许我在我的8核PC上一次排队12个构建任务,.cpp自动并行构建12个~100%文件,处理隐式构建规则/依赖项,我正在尝试在Visual Studio Professional和MSBuild中实现相同的功能。当我的构建受到I / O限制时,这种方法最能使所有内核保持Private Sub Worksheet_Calculate() If ThisWorkbook.Sheets("Dashboard").Range("Z11").Value > 0 Then ThisWorkbook.Sheets("Dashboard").Shapes("tileOverdueTasks").Fill.ForeColor.RGB = RGB(185, 0, 0) Else ThisWorkbook.Sheets("Dashboard").Shapes("tileOverdueTasks").Fill.ForeColor.RGB = RGB(0, 185, 0) End If End Sub 使用。

    谢谢。

2 个答案:

答案 0 :(得分:6)

编译器的/MP开关(cl.exe)和/m的{​​{1}}选项确实是可行的方法。以下是一些相关的documentation摘录:

  

/ 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个命令窗口,并且在它们两个同时调用msbuild.exe之类的命令时,您将同时运行6个编译器进程。你正在追求的是哪种行为,以及msbuild可以做的事情。

调用cl /MP3 a.cpp b.cpp c.cpp的输出:

  

/ maxcpucount [:n]指定最大并发进程数   与...建立。如果未使用该开关,则使用的默认值为1。   如果使用的开关没有值,MSBuild将使用最多   计算机上的处理器数量。 (简称:/ m [:n])

更相关的信息here,特别是它所说的部分

  

BuildInParallel是MSBuild任务上的可选布尔参数。   当BuildInParallel设置为true(其默认值)时,为多个   生成工作进程以同时构建任意数量的项目   时间尽可能。为了正常工作,/ maxcpucount开关   必须设置为大于1的值,并且系统必须至少为   双核或有两个或更多处理器。

现在,如果你只是在一个典型的项目上调用msbuild /?,这将不会做任何特别的事情,因为只有一个项目需要构建。但是,如果在msbuild文件中,则调用MsBuild任务,如

msbuild /m my.vcxproj

将/ m选项传递给msbuild,然后msbuild将根据上面列出的规则生成多个其他msbuild进程。巧合的是,这正是使用msbuild构建解决方案时所发生的情况。 Msbuild首先converts the solution到一个实际的msbuild文件,该文件使用解决方案中的项目列表调用MsBuild任务。因此,可以并行构建多个项目,并为此创建多个msbuild进程。反过来,如果这些是设置了/ MP选项的C ++项目,那么每个项目都将创建多个编译器进程,产生最多<MsBuild Projects="@(ListOfProjects)" BuildInParallel="True"/> 个并行编译。这取决于您的构建机器什么是最佳,如果您希望您可以使用选项(为了有效地执行此操作,您的每个项目将导入一个公共属性表,您在其中设置/ MP选项,否则您必须编辑所有这些都是单独的)并查看msbuild在构建完成时报告的时间。我总是将/ m和/ MP的参数保留为默认值,因为我不希望其他使用我的项目的开发人员有可能的次优配置,并且因为它很容易使CPU最大化。

答案 1 :(得分:2)

您可以通过调用以下命令行来实现此目的:

MSBuild /m:PARALLEL_PROJECT_COUNT /p:CL_MPCount=PARALLEL_FILE_COUNT

结果进程的数量将是:

MSBuild = PARALLEL_PROJECT_COUNT Cl = PARALLEL_PROJECT_COUNT * PARALLEL_FILE_COUNT