make -j4或-j8

时间:2013-03-08 07:58:04

标签: c opencv makefile

我有4个处理器并且正在编译处理器饥饿的应用程序,我读到使用make和-j4交换机建议用于OpenCV,我应该使用-j8以及制作多个处理器的优势是什么?

4 个答案:

答案 0 :(得分:57)

以上答案大多都是正确的。但是,细节有点误导。例如,没有必要为“管理线程”添加额外的作业(注意:make实际上并不是多线程的)。 make永远不会将自己视为-j的目的,因此,正如惠更斯所说,如果你说-j5你将获得5个编译工作,而不是4加制。

大多数人使用[核心数] + [某些填充]的原因与make或它需要什么无关,而是与编译器的性质有关。编译器实际上只是一个非常复杂的文本翻译工具:它以一种形式读取文本并将其转换为另一种形式的“文本”(二进制)。很多(特别是当你的语言变得更复杂,比如C ++)时,需要大量的CPU。但它也需要大量的磁盘I / O.磁盘I / O很慢,因此当一个编译器正在等待磁盘中的某些数据时,内核会安排其他作业运行。这就是为什么你可以有效地同时运行多少核心编译。

在你开始看到收益递减之前你可以获得-j的确切大小(你的构建实际上开始变慢,在某些时候,更多-j)完全取决于你的硬件,构建的种类你正在做等等。唯一可以确定的方法就是实验。

然而,[核心数] + [少数]通常是一个很好的近似值。

答案 1 :(得分:27)

如你所说-j标志告诉make允许生成提供的'threads'数量。理想情况下,每个线程都在自己的核心/ CPU上执行,因此您的多核/ CPU环境将得到充分利用。

make本身不编译源文件。这是由编译器(gcc)完成的。 Makefile(make的输入)包含一组目标。每个目标都有一组依赖关系(在其他目标上)并规则如何构建目标。 make读取Makefile并管理所有目标,依赖项和构建规则。除了编译源文件外,您还可以使用make执行shell命令可以描述的任何任务。

如果将允许的线程数设置得太高,则无法在自己的核心上安排每个线程。需要额外的调度(上下文)开关才能让所有线程执行。这种额外的资源使用显然会导致性能下降。

有多个经验法则,但我认为将总量设置为<number of cores> + 1是最常见的。这背后的想法是所有核心都有自己的线程,还有一个额外的管理线程来处理目标,接下来是构建。

答案 2 :(得分:3)

每个线程一个CPU加一个管理器/加载器。由于从CPU的角度来看,执行磁盘操作的线程在技术上几乎是空闲的,因此在核心总数中添加一个。

如果CPU正在使用超线程,你可以安全地将每个内核计为两个内核并将线程数加倍,因此四核英特尔酷睿i7应该得到-j9(八个虚拟内核和管理器)。在四核AMD上使用-j5

答案 3 :(得分:2)

-j选项仅用于加速应用程序构建,它确定可为构建生成多少作业make。您可以设置-j<nb core>甚至更高-j<nb-core * 1.5>,以便可以并行进行编译。

它对编译的代码没有影响。

对于4核系统,您可以尝试make -j6。如果make可以运行并行构建,它将启动最多6个同时编译过程(例如6个调用gcc)。