MPI生成:可用插槽不足/分配给此作业的所有节点都已填满

MPI生成:可用插槽不足/分配给此作业的所有节点都已填满,mpi,spawn,Mpi,Spawn,我正在尝试使用MPI的生成功能来运行也使用MPI的子流程。我正在使用MPI 2x和动态流程管理 我有一个主进程(也许我应该说是“主程序”),它在python中运行(通过mpi4py),它使用MPI在内核之间进行通信。此主进程/程序在16个内核上运行,它还将对C和Fortran程序(也使用MPI)进行多个MPI\u Comm\u spawn\u调用。当C和Fortran进程运行时,主python程序将等待它们完成 更明确地说,主python程序执行两项主要任务: 使用MPI对步骤(2)中的繁殖进行

我正在尝试使用MPI的生成功能来运行也使用MPI的子流程。我正在使用MPI 2x和动态流程管理

我有一个主进程(也许我应该说是“主程序”),它在python中运行(通过
mpi4py
),它使用MPI在内核之间进行通信。此主进程/程序在16个内核上运行,它还将对C和Fortran程序(也使用MPI)进行多个
MPI\u Comm\u spawn\u调用。当C和Fortran进程运行时,主python程序将等待它们完成

更明确地说,主python程序执行两项主要任务:

  • 使用MPI对步骤(2)中的繁殖进行预处理<在此预处理之后调用code>MPI_Barrier
  • ,以确保所有列组在步骤(2)开始之前都已完成预处理。请注意,预处理分布在所有16个核上,并且在预处理结束时,结果信息被传递回根秩(例如,
    rank==0
  • 预处理后,根列组生成4个worker,每个worker使用4个核心(即,所有16个核心需要同时运行所有4个进程)。这是通过MPI_Comm_spawn_multiple完成的,这些工作人员使用MPI在他们的4个核心内进行通信。在主python程序中,只有
    rank==0
    生成C和Fortran子进程,并且在所有列上的生成之后调用
    MPI_屏障
    ,以便所有
    rank!=0
    核心将等待生成的进程完成后再继续执行
  • 在for循环中重复(1)和(2)多次

  • 我遇到的问题是,如果我使用
    mpiexec-np 16
    启动主python程序,主程序会占用所有内核,我会得到错误:

    分配给此作业的所有节点都已填充

    当程序点击MPI\u Comm\u spawn\u multiple行时

    如果我对
    -np
    使用小于16的任何其他值,则只分配了部分内核,并且有一些可用(但我仍然需要全部16个),因此我会得到类似的错误:

    系统中没有足够的可用插槽来满足4个插槽的要求 根据申请书的要求: /home/username/anaconda/envs/myenvironment/bin/python

    为应用程序请求更少的插槽,或者提供更多可用插槽 供使用

    因此,看起来即使我将在步骤(2)中运行
    MPI\u Barrier
    以阻止生成的进程,直到生成的进程完成,MPI仍然认为这些核心正在使用,并且不会在它们之上分配另一个进程。有办法解决这个问题吗


    (如果答案是hostfiles,你能为我解释一下吗?我不理解完整的想法以及它们在这里可能有什么用处。)

    这是这个问题的海报。我发现我可以使用
    -oversubscribe
    作为
    mpiexec
    的参数来避免这些错误,但正如祖兰在评论中提到的,这可能是一个糟糕的决定


    此外,我不知道核心是否像我希望的那样被订阅。例如,可能所有4个C/Fortran进程都在同一个4核上运行。我不知道怎么说。

    为什么?你试图做的似乎是一个糟糕的解决方案,可能有更好的方法来实现你真正需要的东西。还请澄清您对螺纹的使用。请注意,在MPI 1进程中=1个等级,因此不能有多个等级的主进程。@Zulan,“为什么”需要一个深入的解释,我认为这超出了本文的范围,需要>一页来解释。简言之,这种并行化技术将被集成到材料科学研究的遗传优化框架中。我已经对这个问题进行了一个多月的研究,我相对相信这是正确的技术。我希望我已经澄清了我编辑的帖子中的线索。您将看到这个问题与Python、C和Fortran MPI软件有关,这就是为什么我将您删除的标记包括在内,因为它可能与其他标记有关。我想我现在明白您想要做什么了。您的方法的另一个问题是,即使您解决了您观察到的特定问题,大多数MPI实现在以超额订阅方式工作时的性能都很差。除非您非常小心地配置/调整设置,否则原始预处理列组将在屏障处等待时使用CPU周期,从而降低工作人员的工作速度。您也必须考虑批处理系统,如果它应该是HPC中使用的便携基础设施。恐怕我想不出一个好办法来解决你的实际问题。@Zulan,谢谢你的帮助并让我知道。我不知道超额认购是一个严重的问题。在linux上,您可以使用
    sched_getaffinity
    检查分配给线程的内核。例如,OpenMPI的
    mpiexec
    具有选项
    --报告绑定
    --绑定到
    ,以报告和控制绑定。