Makefile 在GNU Make进程之间划分可用的内核是一个好主意吗?

Makefile 在GNU Make进程之间划分可用的内核是一个好主意吗?,makefile,gnu-make,Makefile,Gnu Make,有没有人见过这样一种情况,运行nGNU使每个进程 $ make -j <number of cores / n> $make-j 比使用所有工具运行它们都要快 $ make -j < number of cores> $make-j 让GNU来处理它。在我的实践中,我从未见过这样的效果,在我看来,做前者是毫无意义的。也就是说,也许有可能编造出具体的非实际例子,说明这种效应会发生,但在现实世界中,不可能 我的问题是,有人在他们的实践中看到过这样的效果吗 补充:当然,

有没有人见过这样一种情况,运行
n
GNU使每个进程

$ make -j <number of cores / n>
$make-j
比使用所有工具运行它们都要快

$ make -j < number of cores>
$make-j
让GNU来处理它。在我的实践中,我从未见过这样的效果,在我看来,做前者是毫无意义的。也就是说,也许有可能编造出具体的非实际例子,说明这种效应会发生,但在现实世界中,不可能

我的问题是,有人在他们的实践中看到过这样的效果吗

补充:当然,假设不同的进程彼此独立,并且可以在逻辑上同时运行

补充:问题不是:手动分区通常会更快吗。我知道答案是:不。问题是,它在实践中会发生吗?有人看见了吗

我尤其对疯狂科学家的答案感兴趣:)


这个问题的主题是StackOverflow,因为上面的行都在程序中,即GNU Make的包装器脚本。(是的,我知道这可能不会成功,但至少我尝试过:)

如您所述,手动分区可能会产生强烈的负面影响:

  • 如果单独的make进程之间没有同步,它们可能会试图同时重建相同的文件,这不仅会导致工作浪费,而且会由于被覆盖的垃圾输入而导致构建失败
  • 即使您能够在没有任何重叠的情况下对整个依赖项链进行分区,在第一个分区完成后,您也会有空闲的CPU
我见过的唯一可以提高makefile速度的技术是:

  • 将“更昂贵”的目标(即链接最多的二进制)放在依赖项列表的前面,以防止在末尾出现空闲CPU
  • 包含包含缓存依赖项的生成的makefile,而不是每次运行时重新计算它们,即使它们没有更改
  • 使用系统避免在源文件更改时间戳而不是内容时重建文件。我只是开始研究在这里什么是可能的

不,我当然认为可以运行它们,因此它们之间没有比赛条件。谢谢你,但我没有问,这通常是个好主意,或者技术是什么。我只是想知道,“你见过它吗”,“你听说过它吗”不,它不能更快,而且几乎总是更慢(也就是说,几乎总是你会得到更少的并行性)我要指出的是,有一个非常好的论坛,可以提出这样的问题,而这些问题并不真正涉及到“帮助”这个主题-make@gnu.org邮件列表。@MadScientist啊,是的,我完全忘记了,所以,是的,先生,我会问的