Parallel processing 混合使用单线程和多线程配方运行make

Parallel processing 混合使用单线程和多线程配方运行make,parallel-processing,makefile,openmp,Parallel Processing,Makefile,Openmp,我有一个makefile,它编译并运行一组相当大的程序,以生成输出。有些程序是单线程的,有些程序使用OpenMP在多个CPU核上运行。相当多的任务需要很长时间才能运行,因此传递“-j”选项以使单线程程序能够并行运行是非常有用的。然而,OpenMP任务已经使用了所有可用的CPU核(以及相当多的RAM),因此它们应该一次运行一个 我是否可以在makefile中为使用OpenMP的任务附加一个标志,以防止其他任务并行运行,同时允许其他任务在其他时间并行运行?我认为.NOTPARALLEL特殊目标完全禁

我有一个makefile,它编译并运行一组相当大的程序,以生成输出。有些程序是单线程的,有些程序使用OpenMP在多个CPU核上运行。相当多的任务需要很长时间才能运行,因此传递“-j”选项以使单线程程序能够并行运行是非常有用的。然而,OpenMP任务已经使用了所有可用的CPU核(以及相当多的RAM),因此它们应该一次运行一个


我是否可以在makefile中为使用OpenMP的任务附加一个标志,以防止其他任务并行运行,同时允许其他任务在其他时间并行运行?我认为.NOTPARALLEL特殊目标完全禁用了所有并行性。

我可以想到三种可能性:

1) 如果任务相互依赖,make将不会并行运行任务。 因此,您可以尝试通过向想要单独运行的目标添加虚假依赖项来欺骗make。例如,声明您的OpenMP目标依赖于所有串行目标的输出

2) 您还可以将Makefile拆分为两个不同的文件:一个用于无法并行运行的OpenMP目标,另一个用于串行目标。这意味着您在OpenMP和串行目标之间没有交叉依赖关系


3) 将编译和运行分开。使用bash脚本来运行您想要的东西。

正是我想要的,但还没有被纳入GNU make。任何进一步的想法都是受欢迎的。1是不受欢迎的,是一种黑客行为,并且会导致在不必要时重新运行食谱。使用makefile的全部目的是只重建已更改的部分。2-告诉我更多信息-不幸的是,一些系列配方确实依赖于一些OpenMP配方,反之亦然。3-那么我就没有办法在make的控制下构建整个批次,确保只重建已更改的配方。看起来您的依赖性使其成为一个难题。使用文件进行进程间通信怎么样?您可以使用一个包装器脚本来检查锁文件,如果存在,请先休眠几秒钟,如果没有,请创建它并运行OpenMP程序。删除脚本末尾的文件。Makefile应该在一开始就删除它,以避免死锁。我已经想到了这一点。目前,我已经将上面的gnu make补丁改编为最新版本(这并不难),并编译了一个新的make。我们来看看结果如何。不幸的是,没有任何快速简单的方法来鼓励make维护人员包括补丁,即使它已经准备好并等待。