我有一个运行时间从几个小时到几天的test script。测试脚本反复构建一个库,并在不同的配置下运行其自检。
在台式机和服务器上,该脚本可以获得加速,因为它使用了-j N,其中N是可用核心的数量。运行测试脚本大约需要2个小时。
在像LeMaker Hikey (8-core ARM64/2GB RAM)和CubieTruck (8-core ARM/2GB RAM)这样的开发板上,我不能使用-j N (即使是N=2或N=4),因为一个文件是真正的怪物,会导致OOM。在这种情况下,脚本可能需要几天时间才能运行。
我的问题是,我如何制作一个make配方,告诉GNUmake用-j 1处理这一个源文件?这有可能吗?
发布于 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不带数字参数,这意味着并行运行尽可能多的作业,这是向下传递的,因为多个无穷大不超过一个。
对我来说,这意味着没有办法将特定的任务分配给单个核心。不过,还是值得一试的。
发布于 2016-05-19 23:15:02
先做大的目标,然后再做其他的事情。
.PHONY: all
all:
⋮
.PHONY: all-limited-memory
all-limited-memory:
${MAKE} -j1 bigfile
${MAKE} all所以现在
$ make -j16 all在expected.$ make -j4 all-memory-limited串行构建大文件时工作(如果出错则退出),继续并行完成其余工作。https://stackoverflow.com/questions/37047472
复制相似问题