Visual Studio 2010,超线程处理器的最大并发C ++编译

时间:2011-06-16 13:59:29

标签: c++ visual-studio-2010 compiler-construction parallel-processing hyperthreading

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

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

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

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

所以我的问题是:

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

这将为我节省大量时间。

非常感谢您提前,

尼古拉斯

3 个答案:

答案 0 :(得分:5)

  

这将为我节省大量时间。

不,它不会。当您运行使用CPU内部补充资源的不同类型的任务时,超线程非常有用。例如,一个线程使用大量浮点而另一个不使用浮点数。虽然第一个是进行浮点数学运算,但其余的CPU可供另一个线程使用。

由于显而易见的原因,一堆编译线程需要相同的内部CPU资源。所有你实现的是拥有两倍的线程争夺CPU缓存和资源。更多的缓存争用会使生命变慢,而不是更快。


嗯,上面解释了为什么你不会从超线程和同质代码中获得巨大收益。并行化的传统智慧是将作业数量设置为大于核心数量,假设1 / N进程可能正在执行磁盘I / O.当然,除了实际的编译之外,Unix的用途还包括编写大量makefile的工作。

如果在任务管理器报告的CPU使用率中将旋钮向上旋转到8并且没有看到任何变化(请注意,由于上述原因,可能是吞吐量的负面变化),这可能是因为您的解决方案中的相互依赖性是强制的某些编译任务按顺序运行。如果一个任务依赖于另一个任务的输出(预编译头通常会导致这种情况),则会限制同时作业的数量 - 即使您拥有16个核心系统,您仍然无法获得比项目结构允许的并行性更多的并行性。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为这是visual studio的一个问题。尝试使用并行nmake克隆的“jom”运行makefile。使用它而不是msvc时,你会看到增加35%,称为4核编译。