4

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

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

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

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

所以我的问题是:

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

这将为我节省大量时间。

非常感谢您,

尼古拉斯

4

3 回答 3

5

这将为我节省大量时间。

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

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


好吧,上面解释了为什么您不会从超线程和同质代码中获得巨大收益。并行生成的传统观点是将作业数设置为比内核数大一,假设 1/N 进程可能正在执行磁盘 I/O。当然,这是针对 Unix make 的,其中除了实际编译之外,作业还执行大量 makefile 处理。

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

于 2011-06-16T14:02:58.943 回答
0

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

于 2011-06-16T14:01:11.757 回答
0

我认为这是视觉工作室的问题。尝试使用“jom”并行 nmake 克隆运行您的 makefile。与调用 4 核编译的 msvc 相比,您应该会看到 35% 的增长。

于 2012-01-25T05:45:46.933 回答