有沒有一種方法使用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
運行代碼)
從你的其他合併命令[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
您無法通過合併來完成此操作。它不合並兩個傳播者,只是一個互通者。 –