当我进行内核编译时,我在make上遇到-j
选项并行执行。在this中make runs as many recipes simultaneously as possible
说I was wondering, there should be a maximum limit for parallel execution.
Does it depend upon the cores ??
。
{{1}}
答案 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