make -j4或-j8

41 c opencv makefile

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

Mad*_*ist 68

上面的答案大多都是正确的.但是,细节有点误导.例如,没有必要为"管理线程"添加额外的作业(注意:make实际上并不是多线程的). make从来没有把自己视为一项工作-j,因此,正如惠更斯所说,如果你说-j5你将得到5个编译工作,而不是4加制.

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

-j在您开始看到收益递减之前,您可以获得多大的数据(您的构建实际上开始变慢,在某些时候,更多-j)完全取决于您的硬件,您正在进行的构建类型等.唯一的方法是知道肯定是实验.

但是,[核心数] + [少数]通常是一个很好的近似值.


Veg*_*ger 36

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

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

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

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