我正在尝试使用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程序做了两件事:
MPI_Comm_spawn_multiple
以确保所有排名在步骤(2)开始之前已完成预处理。请注意,预处理分布在所有16个核心上,并且在预处理结束时,结果信息将传递回根级别(例如MPI_Barrier
)。rank == 0
完成的,这些工作人员使用MPI在其4个核心内进行通信。在主python程序中,只有MPI_Comm_spawn_multiple
产生C和Fortran子进程,并且在所有等级上产生后调用rank == 0
,以便所有MPI_Barrier
核心等到产生的进程完成在他们继续执行之前。 我遇到的问题是,如果我使用rank != 0
启动主python程序,主程序将占用所有内核,我收到错误:< / p>
为此作业分配的所有节点都已填满。
当程序点击mpiexec -np 16
行时。
如果我对MPI_Comm_spawn_multiple
使用小于16的任何其他值,那么只分配了一些核心,有些核心可用(但我仍然需要全部16个),所以我得到了类似的错误:
系统中没有足够的插槽可满足4个插槽 应用程序要求: 的/ home /用户名/安纳康达/ ENVS / myenvironment / bin中/蟒
为您的应用程序请求更少的插槽,或者提供更多可用插槽 使用。
所以看起来即使我要在步骤(2)中运行-np
来阻止直到产生的进程完成,MPI仍然认为这些核心正在被使用,并且不会在其上分配另一个进程他们。有办法解决这个问题吗?
(如果答案是主机文件,你能否为我解释一下?我不了解完整的想法以及它们在这里如何有用。)
答案 0 :(得分:0)
这是这个问题的海报。我发现我可以使用-oversubscribe
作为mpiexec
的参数来避免这些错误,但正如祖兰在他的评论中所提到的,这可能是一个糟糕的决定。
此外,我不知道核心是否正在订阅,就像我希望它们一样。例如,可能所有4个C / Fortran进程都在相同的4个核心上运行。我不知道怎么说。