2013-12-24 108 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

您無法通過合併來完成此操作。它不合並兩個傳播者,只是一個互通者。 –