我有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
来处理这个源文件?它甚至可能吗?
答案 0 :(得分:1)
我不确定是否有可能。目前尚不清楚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系统都会;其他人通常不支持),. parent make和所有子make将进行通信以确保 它们之间只有N
个作业同时运行。 请注意,任何标记为递归的作业(请参阅而不是执行 食谱)不计入总工作量(否则我们可以得到N
子进行运行并且没有留下任何实际工作的插槽!)如果您的操作系统不支持上述通信,那么 始终将
-j 1
放入MAKEFLAGS而不是您的值 指定。这是因为如果传递-j
选项 sub-make,你会获得比你更多的并行运行的工作 要求。如果你给-j
没有数字参数,那就意味着要运行 尽可能多的工作并行,这是传递下来,因为 多个无穷大不超过一个。
这表明我无法将特定作业分配给单个核心。虽然值得一试。
答案 1 :(得分:0)
首先制作大目标, 然后其他一切事后并行。
.PHONY: all
all:
⋮
.PHONY: all-limited-memory
all-limited-memory:
${MAKE} -j1 bigfile
${MAKE} all
所以现在
$ make -j16 all
按预期工作。$ make -j4 all-memory-limited
按顺序构建 bigfile (如果出错则退出),继续并行完成其余工作。