, 당신은 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.ROOT
및 MPI.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
나는 희미하게 MPISpawn 우리가 사용하는 인트라 커뮤니케이터 (또는 다른 방법으로는 대조적으로 간 커뮤니케이터를 반환 기억 일주). 그러나 한 유형을 다른 유형으로 변환 할 수 있습니다. 이에 대해서는 MPI 표준을 참조하십시오. –
혹시() MPI_Finalize를 호출합니까? 모든 프로세스에서? –
부모 프로세스가 브로드 캐스트에 참여해야합니다. –