如何解决重复产生新进程时,为什么OpenMPI必需--oversubscribe?
在第一个进程已断开连接后,我尝试重新生成新进程时,OpenMPI给出以下错误消息:All nodes which are allocated for this job are already filled.
这是我要运行的代码:
master.py
from mpi4py import MPI
import numpy
import sys
gcomm = MPI.COMM_WORLD
universe_size = gcomm.Get_attr(MPI.UNIVERSE_SIZE)
print('Universe size is ',universe_size)
print('Main job running on rank {} of size {}'.format(gcomm.rank,gcomm.size))
def spawn_job(count,procs):
comm = MPI.COMM_SELF.Spawn(sys.executable,args=['worker.py'],maxprocs=procs)
print('Master r/s: {}/{}'.format(comm.rank,comm.size))
N = numpy.array(100,'i')
comm.Bcast([N,MPI.INT],root=MPI.ROOT)
PI = numpy.array(0.0,'d')
comm.Reduce(None,[PI,MPI.DOUBLE],op=MPI.SUM,root=MPI.ROOT)
print('pi = {}'.format(PI))
comm.disconnect()
np = 1
for i in range(5):
print('\nExecution #{}'.format(i))
spawn_job(i,np)
worker.py
from mpi4py import MPI
import numpy
comm = MPI.Comm.Get_parent()
print('Worker r/s: {}/{}'.format(comm.rank,comm.size))
N = numpy.array(0,dtype='i')
comm.Bcast([N,root=0)
h = 1.0 / N
s = 0.0
for i in range(comm.rank,N,comm.size):
x = h * (i + 0.5)
s += 4.0 / (1.0 + x**2)
PI = numpy.array(s * h,dtype='d')
comm.Reduce([PI,None,root=0)
comm.disconnect()
在具有2个物理核心的计算机上运行,如果我使用mpirun -np 1 python master.py
运行,则会收到上述错误。如果我改用mpirun -np 1 --oversubscribe python master.py
,则代码将成功运行。但是,我从来不要求代码同时运行两个以上的进程,因此,我认为只要生成的进程完全断开连接,它就可以正常运行。我还可以通过包含3个插槽的主机文件来强制超额预订,这似乎表明每次产生一个新进程时,前一个进程并没有完全断开连接,但是当产生下一个进程时,以前占用的插槽再次开放。我对此很陌生,但是我希望当生成的作业断开连接时,一切都会恢复到好像没有生成任何东西的方式。
我已经在Mac和Linux机器上同时在运行mpi4py 3.0.3的OpenMPI 4.0.1和4.0.5上看到了这种行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。