首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否覆盖一个源文件的-j设置?

是否覆盖一个源文件的-j设置?
EN

Stack Overflow用户
提问于 2016-05-05 17:51:59
回答 2查看 90关注 0票数 0

我有一个运行时间从几个小时到几天的test script。测试脚本反复构建一个库,并在不同的配置下运行其自检。

在台式机和服务器上,该脚本可以获得加速,因为它使用了-j N,其中N是可用核心的数量。运行测试脚本大约需要2个小时。

在像LeMaker Hikey (8-core ARM64/2GB RAM)CubieTruck (8-core ARM/2GB RAM)这样的开发板上,我不能使用-j N (即使是N=2N=4),因为一个文件是真正的怪物,会导致OOM。在这种情况下,脚本可能需要几天时间才能运行。

我的问题是,我如何制作一个make配方,告诉GNUmake用-j 1处理这一个源文件?这有可能吗?

EN

回答 2

Stack Overflow用户

发布于 2016-05-07 21:18:30

我不确定这是否可能。目前还不清楚Make如何在内核之间划分工作。

4.9 Special Built-in Target Names提到

.NOTPARALLEL

  • 如果将.NOTPARALLEL作为目标,则即使给定了-j选项,此make调用也将串行运行。任何递归调用的make命令仍将并行运行配方(除非它的makefile也包含此目标)。忽略此目标上的任何先决条件。

然而,5.7.3 Communicating Options to a Sub-make说:

-j选项是一个特例(请参见Parallel Execution)。如果您将其设置为某个数值N,并且您的操作系统支持它(大多数UNIX系统都支持它;其他系统通常不支持),那么父make和子make将进行通信,以确保它们之间只有N作业同时运行。请注意,任何标记为递归的作业(请参阅而不是执行处方)不会计入总作业数(否则我们可能会让N子组件运行,并且没有为任何实际工作留出空位!)

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

对我来说,这意味着没有办法将特定的任务分配给单个核心。不过,还是值得一试的。

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 23:15:02

先做大的目标,然后再做其他的事情。

代码语言:javascript
复制
.PHONY: all
all:
    ⋮

.PHONY: all-limited-memory
all-limited-memory:
    ${MAKE} -j1 bigfile
    ${MAKE} all

所以现在

  • $ make -j16 all在expected.
  • $ make -j4 all-memory-limited串行构建大文件时工作(如果出错则退出),继续并行完成其余工作。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37047472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档