Skip to main content
 首页 » 编程设计

python之派生进程能否与 "main"MPI 通信器通信

2025年05月04日15kevingrace

有没有办法使用 MPI 让生成的进程与 MPI_WORLD 中的所有其他参与者通信,而不仅仅是与生成进程的父进程通信?

现在我有两个主要代理,即所谓的主从,它们运行以下代码 (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() 

反过来,slave 又产生 1 个运行以下代码的进程(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 运行代码)

请您参考如下方法:

对于从属进程生成的与主进程通信的进程,它需要使用 MPI_CONNECT 和 MPI_ACCEPT 之类的东西创建另一个新的通信器。可以这样做,但是您必须使用从设备来传输两者之间的连接详细信息。

在您完成所有这些之前,请确保您不能以更多的流程开始您的工作并任意将不同的角色分配给不同的级别。在最好的情况下使用内部通信器是一件痛苦的事情,从正确数量的进程开始可能更简单。