C++如何限制visual studios多处理器编译

Posted

技术标签:

【中文标题】C++如何限制visual studios多处理器编译【英文标题】:C++ How to limit visual studios multi-processor compilation 【发布时间】:2016-03-13 18:50:47 【问题描述】:

每次我使用 Visual Studio 编译时,我的计算机的其余部分都会爬行,因为 Visual Studio 占用了所有处理器。有没有办法限制 Visual Studio 使用的处理器数量,这样我仍然可以在编译期间完成一些工作?

顺便说一句,我正在使用 Visual Studio 2013 和 2015 并使用 C++ 进行编程。

谢谢!

【问题讨论】:

在Tools/Options/Projects and Solutions/Build and Run,可以设置最大并发构建数。如果您以这种方式调用构建,还有命令行选项(例如正式的构建配置系统)。 这似乎不起作用。 Visual Studio 仍在产生一堆编译器驱动程序进程。 它似乎确实减少了编译器驱动程序的数量,但即使我将其设置为一个,也有四个编译器驱动程序进程,它们占用了 100% 的 cpu。 (如果它在 4 时,则产生 12+ 个编译器驱动程序进程) 对于 msbuild,有 /m:1 开关。 与***.com/questions/53503593/… 高度相关(最佳答案 = 只需运行.reg 【参考方案1】:

如果您有一个包含大量 .cpp 文件的单个 C++ 项目并且您不希望一次构建 8 个项目,那么设置“最大并行项目构建数”不是答案。要控制它,请转到工具 > 选项 > 项目和解决方案 > VC++项目设置,然后在Build 部分,将 Maximum Concurrent C++ Compilations 设置为要并行编译的 .cpp 文件的最大数量。默认设置似乎是 0,这显然意味着没有最大值。我有 4 核/8 线程,并将这个值设置为 4,VS 现在一次只编译 4 个文件而不是 8 个。

这些说明基于 Visual Studio 2017,但我认为有几个版本是这样的。

【讨论】:

恐怕还不够,sence VS 还可以并行化项目构建(参见 Digital_Reality 的回答)。每个项目都会产生这个数量的cl.exe 是的,这似乎是一个巨大的疏忽,您只能限制项目数量和每个项目的编译线程数,而不是线程总数。【参考方案2】:

对于 Visual Studio 2015,将“Maximum number of parallel project builds”更改为所需的数字。 (可能是您的 m/c 中的一半处理程序)

菜单> 工具 > 选项 > 项目和解决方案 > 构建和运行。编辑值。

VS2015 截图

此外,最大并发 c++ 编译可以在

中进行限制

菜单> 工具 > 选项 > 项目和解决方案 > VC++ 项目设置 > 最大并发 c++ 编译 > 编辑值。

请注意,如果使用 0 则将使用所有 CPU。

【讨论】:

这似乎很重要。它限制了同时构建项目的数量,但它仍然可以一次启动 8 个 cl.exe 实例。因此,我在编译时获得了 100% 的 CPU 使用率,而不是恒定的 100% CPU 使用率,而在链接时则非常低。 更改“最大并行项目构建数”没有帮助,因为一个项目中的 cpp 文件是并行编译的。我将此值设置为 1,但在构建期间我的 PC 上的 CPU 负载仍为 100%。 如前所述,并发cl.exe不会被这个选项减少,下面的答案更好 我认为正确的答案是更改“最大并发 C++ 编译”,因此将这部分向上移动会很好。【参考方案3】:

我找到了一个真正适合我的解决方法。手动限制 VS 进程的亲和力。打开任务管理器,进入详细信息选项卡,右键单击devenv.exe,选择“设置亲和力”。在对话框中取消选中几个核心。就是这样。所有生成的cl.exe 进程都将继承亲和性,因此不会在未勾选的核心上运行。

另外,为 Visual Studio 的功能请求投票:https://developercommunity.visualstudio.com/content/idea/436208/limit-cpu-usage-of-visual-studio.html

【讨论】:

这基本上可行,它限制了 VS 可以使用的总物理 CPU。然而,它有点愚蠢,因为 VS 仍然试图编译与物理内核一样多的东西。我将它限制为 6 个 CPU 内核,但它仍然试图一次编译 8 个东西。【参考方案4】:

对于 C++ 使用

*msbuild /p:CL_MPCount=X 

其中 X 是编译器驱动程序的编号。我在编译 Tensorflow 源代码时使用它来限制 CPU 利用率。

阅读本文了解更多详情:ms's blog on vs2010 c++ parallel building

【讨论】:

从链接中,CL_MPCount 标志与 Eric Hill 的回答具有相同的效果。【参考方案5】:

Mikhail Virovets 给出了更理想的答案 https://developercommunity.visualstudio.com/comments/497084/view.html

将编译器进程的优先级降低到低于正常值。这意味着它将使用尽可能多的 CPU,但不会干扰您尝试使用的其他东西。

定义一个注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cl.exe\PerfOptions

然后创建一个名为CpuPriorityClass = 5 的 DWORD 值(5 表示“低于正常值”)。

请注意,这会影响所有名为“cl.exe”的进程。

【讨论】:

【参考方案6】:

/MP 选项可能会做到这一点。它限制了构建项目时产生的进程数。因此,在您的情况下,您可以像这样使用它/MP1/MP[processMax],其中processMax 是您想要使用的最大进程数)。

【讨论】:

目前我使用的是/MP,但我修改为/MP1。但是,它仍然会产生 4 个进程并占用 100% 的 CPU。【参考方案7】:

如果您运行的是 Windows Vista/7(可能是 XP,但不确定),这真的很简单。 输入:Control+Shift+Esc 启动你的任务管理器。 单击“进程”选项卡 查找需要更改其处理器亲和性的进程 右键单击进程 点击“设置亲和力” 您可以在此处选择您的进程将使用的处理器。 编辑:你必须是管理员才能让它工作。

【讨论】:

这确实有效。但是,我需要做一些研究才能让它在 Windows 10 上运行。基本上,您需要进入详细信息选项卡,这允许您右键单击给定进程并设置它的亲和力。 你改变亲和力的过程是什么? MSBuild 还是 devenv?

以上是关于C++如何限制visual studios多处理器编译的主要内容,如果未能解决你的问题,请参考以下文章

(Visual Studio 杂记) )—— Visual Studio 如何 设置 C++ 标准版本

我可以在 Visual Studio 2012 中编译和调试(运行)单个 C++ 文件吗? (如何避免创建太多项目)

如何在 Visual Studio 中自动将预处理器和注释块插入到新的 C++ 头文件中?

Visual studio 2010 C++用Release运行是单线程吗?怎样提高运算速度?

在 Microsoft Visual Studio 2015 的 C++ 项目中包含 Armadillo C++ 库

Visual Studio C++ - 无法输出预处理文件