【问题标题】:Can a spawned process communicate with the "main" MPI communicator衍生进程能否与“主”MPI 通信器通信
【发布时间】:2013-12-25 11:33:47
【问题描述】:

有没有办法使用 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 运行代码)

【问题讨论】:

    标签: python mpi spawn


    【解决方案1】:

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

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

    【讨论】:

    • 其他post 的合并命令不行吗?我可以重写代码并初始化 1 个 master、n 个 slave 和 n 个 spawnees,但为了提高效率,spawneys 和 slaves 在同一个处理器上似乎很重要。我试过 1. 函数调用 2. 线程, 3. MPI.Spawn。使用 1 和 2,我无法动态安排奴隶和生成者之间的通信。使用 3. 我可以在 slave 和 spawnee 之间进行通信,但不能在 slave 之间同时进行通信:icomm.recv 或 comm.recv
    • 你是正确的,你不能用合并来做到这一点。它不会合并两个通信器,只是一个交互器。
    猜你喜欢
    • 2014-03-18
    • 2017-03-19
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2013-02-07
    • 2021-09-13
    相关资源
    最近更新 更多