MPI Spawn:没有足够的可用插槽/已为此作业分配的所有节点都已填充

时间:2016-06-28 22:29:51

标签: mpi spawn

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

我有一个主进程(也许我应该说“主程序”)在python(通过<div ng-controller="MainController" class="main-guy"> <div class="screen-inside"> <div class="audio-container" ng-controller="AudioController"> </div> </div> </div>)中运行,它使用MPI在内核之间进行通信。此主进程/程序在16个内核上运行,它对{C}和Fortran程序(也使用MPI)进行mpi4py调用。当C和Fortran进程运行时,主python程序会一直等到它们完成。

更明确地说,主python程序做了两件事:

  1. 使用MPI对步骤(2)中的产生进行预处理。在此预处理之后调用MPI_Comm_spawn_multiple以确保所有排名在步骤(2)开始之前已完成预处理。请注意,预处理分布在所有16个核心上,并且在预处理结束时,结果信息将传递回根级别(例如MPI_Barrier)。
  2. 在预处理之后,根级别产生4个工作者,每个工作者使用4个核心(即,需要所有16个核心同时运行所有4个进程)。这是通过rank == 0完成的,这些工作人员使用MPI在其4个核心内进行通信。在主python程序中,只有MPI_Comm_spawn_multiple产生C和Fortran子进程,并且在所有等级上产生后调用rank == 0,以便所有MPI_Barrier核心等到产生的进程完成在他们继续执行之前。
  3. 在for循环中多次重复(1)和(2)。
  4. 我遇到的问题是,如果我使用rank != 0启动主python程序,主程序将占用所有内核,我收到错误:< / p>

      

    为此作业分配的所有节点都已填满。

    当程序点击mpiexec -np 16行时。

    如果我对MPI_Comm_spawn_multiple使用小于16的任何其他值,那么只分配了一些核心,有些核心可用(但我仍然需要全部16个),所以我得到了类似的错误:

      

    系统中没有足够的插槽可满足4个插槽   应用程序要求:      的/ home /用户名/安纳康达/ ENVS / myenvironment / bin中/蟒

         

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

    所以看起来即使我要在步骤(2)中运行-np来阻止直到产生的进程完成,MPI仍然认为这些核心正在被使用,并且不会在其上分配另一个进程他们。有办法解决这个问题吗?

    (如果答案是主机文件,你能否为我解释一下?我不了解完整的想法以及它们在这里如何有用。)

1 个答案:

答案 0 :(得分:0)

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

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