0

在进行内核编译时,我遇到-j了并行执行的 make 选项。据说在这个那个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 ??
4

2 回答 2

2

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

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

一般来说,您应该始终为-j.

一种选择:您可能希望同时使用-j(无参数)-l(根据系统负载限制作业)。只要系统负载不高于某个值,这将允许您运行尽可能多的作业。这很有用但不是很准确,因为 make 启动作业的速度系统识别负载变化的速度要快得多。代码中有一些技巧可以尝试减轻这种情况;值得一试。

当然,您总是可以同时给出最大作业数-jN 最大系统负载-l

于 2013-11-12T13:46:40.307 回答
1

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

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

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

于 2013-11-12T10:57:48.373 回答