2013-12-24 47 views
2

有没有一种方法使用MPI让产生的进程与MPI_WORLD中的所有其他参与者进行通信,而不仅仅与产生该进程的父进程通信?可以产生一个进程与“主”MPI通信器通信

现在我有两个主要剂,所谓的主设备和从该运行下面的代码(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() 

从属,反过来,产卵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运行代码)

回答

1

对于从服务器产生的与主服务器进行通信的过程,需要使用MPI_CONNECT和MPI_ACCEPT之类的东西创建另一个新的通信服务器。可以这样做,但是你必须使用从站来传输两者之间的连接细节。

在您完成所有这些工作之前,请确保您不能只使用更多流程来开始工作,并将不同的角色分配给不同的职级。在最好的情况下使用互联网通信器是一件痛苦的事情,从正确的流程开始可能会更简单。

+0

从你的其他合并命令[post](http://stackoverflow.com/questions/9970409/mpi-spawn-root-process-does-not-communicate-to-child-processes)不会做?我可以重写代码并初始化1个主,n个从属和n个spawnees,但为了提高效率,spawnees和slave在同一个处理器上似乎很重要。我试过1.函数调用2.线程,3. MPI.Spawn。 1和2我不能动态地安排从属和spawnees之间的通信。使用3.我可以在slave和spawnee之间进行通信,但不能在slave之间同时进行通信:icomm.recv或comm.recv – user989762

+1

您无法通过合并来完成此操作。它不合并两个传播者,只是一个互通者。 –