2013-12-24 5 views
2

스폰 된 프로세스가 프로세스를 시작한 상위 프로세스와 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으로 코드를 실행합니다)

답변

1

슬레이브가 마스터와 대화하기 위해 만든 프로세스의 경우 MPI_CONNECT 및 MPI_ACCEPT와 같은 것을 사용하여 다른 새로운 커뮤니케이터를 만들어야합니다. 가능한 일이지만, 슬레이브를 사용하여 둘 사이의 연결 세부 사항을 전송해야합니다.

모든 것을 처리하기 전에 더 많은 프로세스로 작업을 시작하고 임의로 다른 역할을 다른 순위에 지정할 수는 없습니다. 최선의 상황에서 인터 커뮤니 케이터를 사용하는 것은 고통이며 정확한 수의 프로세스로 시작하는 것이 더 쉽습니다.

+0

다른 사람의 병합 명령 (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

+1

당신은 합병으로 이것을 할 수 없다는 것이 맞습니다. 두 명의 커뮤니케이터를 병합하지는 않습니다. –