有没有办法使用MPI让衍生的进程与MPI_WORLD中的所有其他参与者进行通信,而不仅仅是与生成进程的父进程进行通信?
现在我有两个主要代理,即所谓的master和slave,运行以下代码(spawn.py):
# Spawn test: master and first slave
import sys
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0 : # master code
print "i am the master on rank %i" % (rank)
running = True
while running :
msg = comm.recv(source=MPI.ANY_SOURCE,tag=0)
print "master received message: ", msg
if msg == "Done" :
running = False
print "master is done"
if rank == 1 : # slave code
no_spawn = 1
print "I am a slave on rank %i, about the spawn lower slaves" % (rank)
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["Cpi.py","ben"],maxprocs=no_spawn)
comm.send("Test_comm",dest=0,tag=0)
icomm.send("Test_icomm",dest=0,tag=0)
isize = icomm.Get_size()
print "on slave, isize= %i" % (isize)
rec = 0
while rec <= (no_spawn-1) :
msg = icomm.recv(source=MPI.ANY_SOURCE,tag=20)
print "slave received message: %s (rec=%i)" % (msg, rec)
rec = rec +1
import time
print "slave going to sleep\n"
time.sleep(1)
for i in range(no_spawn) :
message = ("To spawn from slave",)
icomm.send(message,dest=i,tag=0)
for i in range(no_spawn) :
message = ("Done",)
icomm.send(message,dest=i,tag=0)
msg = comm.recv(source=MPI.ANY_SOURCE,tag=0)
print "slave received message: ", msg
comm.send("Done",dest=0,tag=0)
MPI.Finalize()
奴隶又产生了另外一个运行以下代码的进程(CPi.py,以mpi4py教程文件命名):
#!/usr/bin/env python
import sys
from mpi4py import MPI
comm = MPI.COMM_WORLD
icomm = MPI.Comm.Get_parent()
irank = icomm.Get_rank()
print "Spawn irank=%i" % (irank)
message = "From_Spawn_%i"%(irank)
icomm.send(message,dest=0,tag=20)
running = True
while running :
msg = icomm.recv(source=MPI.ANY_SOURCE,tag=0)
print "Spawn on irank %i received message: %s " %(irank,msg)
if msg[0] == "Done" :
running = False
print "spawn %i sending a last msg to the master and the slave" % (irank)
comm.send(("To master from spawn",), dest=0,tag=0)
comm.send(("To slave from spawn",), dest=0,tag=0)
在主设备和从设备之间,我可以使用comm
通信器发送消息。在从属和生成的进程之间,我可以通过icomm
通信器发送消息。但我真正想要的是产生一个进程,并且该进程可以通过comm
通信器与主进程和从进程通信;查看生成过程的最后两行。那可能吗?并且生成的进程是否可以同时监听从属和主服务器使用的主comm
?会发送/收听哪个等级?
提供的代码不会终止,因为派生进程发送的最后两条消息既不会被从服务器接收,也不会被主服务器接收。 (我使用mpiexec -n 2 python spawn.py
)
答案 0 :(得分:1)
对于奴隶产生的与主人交谈的过程,需要使用MPI_CONNECT和MPI_ACCEPT之类的东西创建另一个新的通信器。这是可能的,但你必须使用奴隶来传输两者之间的连接细节。
在您完成所有这些之前,请确保您不仅可以通过更多流程开始工作,而且可以随意将不同的角色分配给不同的职位。在最好的情况下使用内部通信器是一件痛苦的事情,并且开始使用正确数量的进程可能更简单。