2016-11-05 2 views
1

t1.py라는 프로그램을 실행하는 프로세스가 하나 있는데이 프로세스는 t2.py를 실행하는 다른 3 개의 프로세스를 생성합니다. 산란 된 프로세스에서 0의 순위를 갖는 값을 다른 두 개의 스폰 된 프로세스에 브로드 캐스팅하려고합니다. 그러나 bcast가 호출되면 프로그램이 차단됩니다. 왜 이런 일이 일어나는 지 아십니까? 어떻게 해결할 수 있습니까? 그냥 차일이 서로 대화 할 경우mpi4py : 생성 된 프로세스 간 통신

t1.py

from mpi4py import MPI 
import sys 

sub_comm = MPI.COMM_SELF.Spawn(sys.executable, args=['t2.py'], maxprocs=3) 
print 'hi' 

t2.py

from mpi4py import MPI 

comm = MPI.Comm.Get_Parent() 

print 'ho ', comm.Get_rank() 
a = comm.bcast(comm.Get_rank(), root=0) 
print a 

출력

hi 
ho 2 
ho 0 
ho 1 
+2

나는 희미하게 MPISpawn 우리가 사용하는 인트라 커뮤니케이터 (또는 다른 방법으로는 대조적으로 간 커뮤니케이터를 반환 기억 일주). 그러나 한 유형을 다른 유형으로 변환 할 수 있습니다. 이에 대해서는 MPI 표준을 참조하십시오. –

+0

혹시() MPI_Finalize를 호출합니까? 모든 프로세스에서? –

+1

부모 프로세스가 브로드 캐스트에 참여해야합니다. –

답변

1

, 당신은 MPI.COMM_WORLD 사용할 수 있습니다

a = MPI.COMM_WORLD.bcast(MPI.COMM_WORLD.Get_rank(), root=0) 

MPI.COMM_WORLD.Get_rank(), ' of ',MPI.COMM_WORLD.Get_size()을 인쇄하면 하위의 MPI.COMM_WORLD이 하위로 제한되는지 확인할 수 있습니다.

이제 이 comm=MPI.Comm.Get_parent()으로 얻은 경우 comm.bcast(...)이 실패한 이유를 조사해 보겠습니다. 사실,이 커뮤니케이터의 크기와 등급을 보면 MPI.COMM_WORLD과 매우 비슷하게 보입니다. 그러나 반대로 은 MPI.COMM_WORLD과 매우 다릅니다. intercommunicator입니다. 보다 정확하게는 부모가 자녀에게 이야기 할 수있는 방법입니다. 집단적 의사 소통을 사용할 수 있지만 부모와 자녀 모두의 모든 프로세스는 함수를 호출해야합니다. 특히 Intercommunicator Collective Operations에 대해서는 MPI standards 섹션 5.2.2 및 5.2.3을주의 깊게 읽으십시오. bcast() 대하여, MPI.ROOTMPI.PROC_NULL는 방향 (부모 자식에게 부모 자식) 및 전송 방법을 지정하는 대신에 브로드 root의 순위 사용된다. 마지막으로, 내부 통신자는 Merge() (MPI_Intercomm_merge()에 해당)을 사용하여 상호 통신자의 기본에 정의 할 수 있습니다. 이 공동체 내 의사 소통에서 부모와 자녀는 두 개의 다른 그룹에 속하지 않습니다. 그들은 평소와 같이 고유 한 등급으로 특징 지어지는 프로세스입니다.

여기 intercommunicator위한 bcast() 행한다 t1.py 및 t2.py의 수정 된 버전이다. 그러면 내부 통신자는 Merge()이고 결과 내부 통신자의 bcast()은 평소와 같이 호출됩니다.

t1.py

from mpi4py import MPI 
import sys 

sub_comm = MPI.COMM_SELF.Spawn(sys.executable, args=['t2.py'], maxprocs=3) 

val=42 
sub_comm.bcast(val, MPI.ROOT) 

common_comm=sub_comm.Merge(False) 
print 'parent in common_comm ', common_comm.Get_rank(), ' of ',common_comm.Get_size() 
#MPI_Intercomm_merge(parentcomm,1,&intracomm); 

val=13 
c=common_comm.bcast(val, root=0) 
print "value from rank 0 in common_comm", c 

t2.py

from mpi4py import MPI 

comm = MPI.Comm.Get_parent() 

print 'ho ', comm.Get_rank(), ' of ',comm.Get_size(),' ', MPI.COMM_WORLD.Get_rank(), ' of ',MPI.COMM_WORLD.Get_size() 
a = MPI.COMM_WORLD.bcast(MPI.COMM_WORLD.Get_rank(), root=0) 
print "value from other child", a 

print "comm.Is_inter", comm.Is_inter() 
b = comm.bcast(comm.Get_rank(), root=0) 
print "value from parent", b 

common_comm=comm.Merge(True) 
print "common_comm.Is_inter", common_comm.Is_inter() 
print 'common_comm ', common_comm.Get_rank(), ' of ',common_comm.Get_size() 

c=common_comm.bcast(0, root=0) 
print "value from rank 0 in common_comm", c