【问题标题】:gnu make -j8 not running things in parallelgnu make -j8 不并行运行
【发布时间】:2015-10-13 14:39:46
【问题描述】:

我正在使用ndk-build 运行 Android NDK make 文件,这只是使用 google makefile 模板运行的普通 gnu make。我用ndk-build -j8 运行它,我可以确认make 命令行确实用-j8 运行
然而,编译继续一个一个地编译我的源文件,从不一次运行clang++。情况并非总是如此。就在几天前,我使用了完全相同的脚本,它使用了所有 8 个内核并且速度更快。
什么能让gnu一下子不尊重-j8
有没有办法让 gnu make 产生任何关于此的解释性信息?各种 --debug 选项好像都没有讲到。

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

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

【问题讨论】:

  • 我猜你的Makefile 中有一些奇怪的依赖。我们无法在看到之前回答您的问题。也许一些-included 文件会造成一些混乱。
  • 顺便说一句,您真的应该将您的 GNU make 升级到 4.1 和/或使用 remakemake --trace 来调试此类问题;试试make clean 和/或make distclean
  • 你的问题应该被关闭,因为这里双重偏离主题:没有显示代码(你应该显示你的Makefile)但要求调试它以及更多关于superuser的主题
  • @BasileStarynkevitch,不同意基于off-topic关闭,make直接落入stackoverflow领域。但是,我们确实需要这里的代码示例。
  • 正如其他人所说,没有代码就无法诊断发生了什么。但是,我猜没有并行编译,因为您引入了一个新的依赖链来阻止它。不会很明显。 ndk-build 包含文件在幕后做了一些棘手的事情。这与显示并行执行的干净构建一致,但不是增量构建。使用您的 vcs 将代码仓库临时回滚到几天前的位置以进行验证。然后看看你从那时起编码的内容。那个时期的某些事情是负责任的。

标签: c++ makefile android-ndk gnu-make


【解决方案1】:

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

这也可能在起作用:Communicating options to a s submake:

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

与您相关:

如果您的操作系统不支持上述通信,则 -j 1 始终放入 MAKEFLAGS,而不是您指定的值。这是因为如果将 -j 选项传递给子制作,您将获得比您要求的更多的并行运行作业。如果你给-j 没有数字参数,意思是并行运行尽可能多的作业,这将被传递,因为多个无穷大不超过一个。

【讨论】:

  • 没有子制作,我只看到一个制作过程
  • @shoosh 以确保它不是您的make,创建一个虚拟的makefile,其中包含一堆仅echo 语句的目标并执行make all --jobs=16。见我的question
【解决方案2】:

以上答案提供了与您的问题相关的已知链接。

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

也许,不知何故,运行您的构建脚本会影响 MAKEFLAGS。

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

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

【讨论】:

    【解决方案3】:

    只是猜测:

    1. 在您的 make 文件中搜索 .NOTPARALLEL 伪目标。它可以防止 gnu make 并行构建。
    2. 您是否设置了-l,负载是否高于此?那么 make 一次不会启动超过一项工作。
    3. 你确定在你重建的时候有独立的东西要建造吗?当然,make 只会并行化任务,它知道彼此独立

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多