我有一个包含大量项目(.sln
)的大型Visual Studio 2010解决方案文件(~50
)。每个项目都包含大约20
.cpp
和.h
个文件。在快速的英特尔i7计算机上构建整个项目大约需要2个小时,所有依赖项都在快速SSD上本地缓存。
我正在尝试replicate an existing experiment I found on this topic,并需要澄清如何:
MSBuild.exe
首先,/m
和/maxcpucount
选项是否相同?我read an article on the /m
option,似乎并行构建了更多项目。这似乎与我通过GUI中的以下操作设置的选项相同:
Maximum number of parallel project builds
还有另一个选项/MP
,我可以通过以下方式访问GUI:
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
使用。
谢谢。
答案 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