繁体   English   中英

gnu make -j8不能并行运行

[英]gnu make -j8 not running things in parallel

我正在使用ndk-build运行一个Android NDK make文件,这是与Google makefile模板一起运行的普通gnu make。 我正在使用ndk-build -j8运行它,并且可以确认make命令行确实与-j8运行
但是,编译将继续clang++地编译我的源文件,而一次运行clang++绝不会超过一次。 并非总是那样。 就在几天前,我使用了完全相同的脚本,它使用了所有8个内核,并且速度要快得多。
有什么可能会使gnu突然不尊重-j8
有没有办法使gnu make对此产生任何解释性信息? 各种--debug选项似乎都没有讨论。

从OSX 10.10.5运行,gnu make的版本为3.81

更新:如果我之前进行过ndk-build clean ,则我之后立即进行的构建可以在所有8个内核上运行。 返回仅在使用1个内核后一天进行的后续构建

您可以检查make实际上是make (使用which maketype make来查看是否包含包装脚本,函数或别名)。

这也可能在起作用:将选项作为asmake进行通信

-j选项是一种特殊情况(请参阅并行执行 )。 如果将其设置为某个数字N并且您的操作系统支持该数字(大多数UNIX系统将支持;其他通常不支持),则父品牌和所有子品牌将进行通信以确保只有N个作业在运行他们之间的同一时间。 请注意,任何标记为递归的作业(请参阅代替执行配方)均不计入总作业中(否则,我们可以运行N个子make,并且没有剩余的插槽可用于任何实际工作!)

与您有关:

如果您的操作系统不支持上述通信,则-j 1始终放在MAKEFLAGS而不是您指定的值。 这是因为,如果将-j选项传递给子-j ,则并行运行的作业将比您要的要多。 如果给-j没有数字参数,这意味着可以并行运行尽可能多的作业,这将被传递下去,因为多个无限多于一个。

只是猜测:

  1. 在您的make文件中搜索.NOTPARALLEL伪目标。 它可以防止并行生成gnu make。
  2. 您是否设置了-l并且负载是否高于此值? 这样一来,make一次最多只能启动一项工作。
  3. 您确定在重建时要构建一些独立的东西吗? 当然, make只会并行化任务,它知道彼此独立

上面的答案给出了与您的问题有关的已知链接。

在不了解您的设置的情况下,我只能猜测:

也许以某种方式,运行您的构建脚本会影响MAKEFLAGS。

您可以尝试将作业数量直接传递给ndk-build脚本。 像这样编辑您的ndk-build脚本:

$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "$@"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM