微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重复产生新进程时,为什么OpenMPI必需--oversubscribe?

如何解决重复产生新进程时,为什么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 举报,一经查实,本站将立刻删除。