最大配方 MAKE 运行

  • 本文关键字:MAKE 运行 makefile
  • 更新时间 :
  • 英文 :


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

需要非常清楚的是:make(至少GNU make)不是多线程的。 但是,由于make实际上并不做任何工作(它启动其他程序来完成这项工作),因此它仍然可以并行运行多个作业:当make以单线程方式进行时,它会启动其他程序并让它们在后台运行,同时继续寻找更多要启动的作业。

Make没有"内核数"的概念。 如果你在没有任何参数的情况下给出-j,make 将启动作业,直到它找不到更多可以启动的作业:也就是说,直到 makefile 中没有更多可以相互独立构建的目标。 在大型构建环境中,这很容易导致整个系统着火;例如,尝试使用没有限制的-j构建 Linux 内核基本上是一个叉子炸弹。

一般来说,你应该总是给-j一个论据。

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

当然,您始终可以使用-jN提供最大数量的作业,并使用-l提供最大系统负载。

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

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

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

最新更新