我正在尝试优化大型VC ++项目的编译时间。 我的处理器是Core i7 950(因为它支持Intel超线程技术,所以是4核,8线程)。

在Microsoft Visual Studio 2010中,如果转到 工具>选项>项目和解决方案> VC ++项目设置>最大并发C ++合并量

您可以选择用于并行C ++编译的最大CPU内核数。 我在那里选择0(以便使用我的所有内核),其产生的结果与使用4或8时完全相同。

现在,如果在编译项目时打开任务管理器,我可以看到正在运行4个并行编译线程(在进程下,它们的描述为:Microsoft C / C ++编译器驱动程序),并且CPU的总使用量为一直少于50%。

所以我的问题是:

在四核超线程处理器中是否可以有8个并行编译线程?如果这不可能,那么在编译时是否可能以某种方式使用接近100%的处理器功率?

这将为我节省大量时间。

非常感谢您

尼古拉斯

有帮助吗?

解决方案

这将为我节省大量时间。

不,不会。当您要运行各种任务,这些任务使用CPU内部的补充资源时,超线程很有用。例如,一个线程使用大量浮点,而另一个则不使用。第一个执行浮点数学运算时,其他线程可以使用其余的CPU。

出于明显的原因,一堆编译线程需要相同的内部CPU资源。您所要做的就是使争用CPU缓存和资源的线程数量增加一倍。更多的缓存争用将使生活变慢,而不是更快。


好吧,以上内容解释了为什么您无法从超线程和同质代码中获得巨大收益。并行制作的传统方法是将作业数设置为比内核数大一,假设1 / N进程可能正在执行磁盘I / O。当然,这是在Unix make上进行的,除了实际的编译之外,工作还执行很多makefile处理。

如果您在Task Manager报告的CPU使用率中将旋钮调至8却没有看到任何变化(请注意,由于上述原因,吞吐量可能出现负变化),这可能是因为解决方案中的相互依赖性正在迫使某些编译任务按顺序运行。如果一个任务依赖于另一个任务的输出(预编译的头文件通常会导致此问题),那么这会限制同时进行的作业数量-即使您使用的是16核心系统,并行性也不会超出项目结构所允许的范围。

其他提示

可能是您受磁盘限制而不是受CPU限制。

我认为这是Visual Studio的问题。尝试使用“ jom”并行nmake克隆运行makefile。与通过msvc调用(使用4个内核进行编译)相比,使用它应该会增加35%。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top