[英]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 make
和type make
来查看是否包含包装脚本,函数或别名)。
这也可能在起作用:将选项作为asmake进行通信 :
-j
选项是一种特殊情况(请参阅并行执行 )。 如果将其设置为某个数字N
并且您的操作系统支持该数字(大多数UNIX系统将支持;其他通常不支持),则父品牌和所有子品牌将进行通信以确保只有N
个作业在运行他们之间的同一时间。 请注意,任何标记为递归的作业(请参阅代替执行配方)均不计入总作业中(否则,我们可以运行N
个子make,并且没有剩余的插槽可用于任何实际工作!)
与您有关:
如果您的操作系统不支持上述通信,则
-j 1
始终放在MAKEFLAGS
而不是您指定的值。 这是因为,如果将-j
选项传递给子-j
,则并行运行的作业将比您要的要多。 如果给-j
没有数字参数,这意味着可以并行运行尽可能多的作业,这将被传递下去,因为多个无限多于一个。
只是猜测:
.NOTPARALLEL
伪目标。 它可以防止并行生成gnu make。 -l
并且负载是否高于此值? 这样一来,make一次最多只能启动一项工作。 make
只会并行化任务,它知道彼此独立 上面的答案给出了与您的问题有关的已知链接。
在不了解您的设置的情况下,我只能猜测:
也许以某种方式,运行您的构建脚本会影响MAKEFLAGS。
您可以尝试将作业数量直接传递给ndk-build脚本。 像这样编辑您的ndk-build脚本:
$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "$@"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.