最大食谱MAKE运行?

时间:2013-11-12 10:07:16

标签: makefile

当我进行内核编译时,我在make上遇到-j选项并行执行。在thismake runs as many recipes simultaneously as possibleI was wondering, there should be a maximum limit for parallel execution. Does it depend upon the cores ??

{{1}}

2 个答案:

答案 0 :(得分:2)

非常清楚:make(至少GNU make)不是多线程的。但是,因为make实际上没有做任何工作(它启动其他程序来完成这项工作)它仍然可以并行运行多个作业:虽然make本身以单线程方式继续运行,但它启动其他程序并让它们在背景,而它继续寻找更多的工作开始。

Make没有“核心数”的概念。如果你给-j没有任何参数,make只会启动作业,直到找不到可以启动的作业为止:也就是说,直到makefile中没有可以相互独立构建的目标为止。在大型构建环境中,这很容易导致整个系统陷入火海;例如,尝试用-j构建Linux内核没有任何限制,基本上是一个分叉炸弹。

一般来说,你应该总是给-j一个参数。

一个选项:您可能希望在-j旁边使用-l(无参数)(根据系统负载限制作业)。只要系统负载不高于某个值,这将允许您运行尽可能多的作业。这很有用,但不是很精确,因为make可以比系统识别负载变化更快地启动 lot 作业。代码中有一些技巧可以缓解这个问题;值得一试。

当然,您始终可以使用-jN -l提供最大系统工作量。

答案 1 :(得分:1)

最大实际并行执行次数由内核数量给出。

但是, make 在给定数量的线程上拆分计算,这甚至可能高于可用核心数。在这种情况下,同一个核心执行多个线程,并且执行实际上并不是并行的(它只是多线程,这意味着更多线程由同一个内核并发运行,给出了并行执行的错觉)

通常,给定N个核,最好将-j设置为等于N + 1