스폰 된 프로세스가 프로세스를 시작한 상위 프로세스와 MPI_WORLD의 다른 모든 프로세스와 통신 할 수 있도록 MPI를 사용하는 방법이 있습니까? 다시 다음을 실행 하나 개 이상의 프로세스를 생성합니다,스폰 된 프로세스가 "주"MPI 커뮤니케이터와 통신 할 수 있습니까
# 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()
슬레이브 :
는 지금은 두 가지 주요 에이전트, 다음 코드 (spawn.py)를 실행 이른바 마스터와 슬레이브가 코드합니다 (mpi4py 튜토리얼 파일의 이름을 따서 명명 CPi.py) : 나는 comm
의사 소통을 사용하여 메시지를 보낼 수있는 마스터와 슬레이브 사이
#!/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)
. 슬레이브와 생성 된 프로세스 사이에서 나는 icomm
커뮤니케이터를 통해 메시지를 보낼 수 있습니다. 하지만 실제로 원하는 것은 프로세스를 생성하고이 프로세스가 comm
커뮤니케이터를 통해 마스터와 슬레이브와 통신 할 수 있다는 것입니다. 생성 된 프로세스의 마지막 두 줄을 참조하십시오. 그게 가능하니? 그리고 생성 된 프로세스가 슬레이브와 마스터가 사용하는 메인 comm
을 수신 할 수 있습니까? 어느 계급에게 보내거나 들으려고합니까?
스폰 된 프로세스가 보내는 마지막 두 메시지가 슬레이브 또는 마스터에서 수신되지 않기 때문에 제공된 코드가 종료되지 않습니다. (mpiexec -n 2 python spawn.py
으로 코드를 실행합니다)
다른 사람의 병합 명령 (http://stackoverflow.com/questions/9970409/mpi-spawn-root-process-does-not-communicate-to-child-processes)하지 않아도됩니까? 코드를 다시 작성하고 1 개의 마스터, n 개의 슬레이브 및 n 개의 스폰을 초기화 할 수 있지만 효율성을 위해 스폰지와 슬레이브가 동일한 프로세서에 있어야합니다. 나는 1. 함수 호출 2. 스레드, 3. MPI.Spawn을 시도했다. 1 & 2로 나는 슬레이브와 스폰의 통신을 동적으로 정렬 할 수 없습니다. 3. 나는 슬레이브와 스폰 위 사이에서 통신 할 수 있지만 슬레이브간에 동시에 통신하지는 않습니다 : icomm.recv 또는 comm.recv – user989762
당신은 합병으로 이것을 할 수 없다는 것이 맞습니다. 두 명의 커뮤니케이터를 병합하지는 않습니다. –