2013-12-23 5 views
1

MPI를 사용하는 일종의 다중 에이전트 시스템이 있습니다. 나는 주된 배우를 mpiexec -np 1 Admin.py : -np 4 Other.py와 함께 시작한다. 각 "other.py"는 또한 하나 이상의 프로세스를 생성합니다. 계산 효율성을 위해 부모 프로세스와 동일한 프로세서 (순위)에서 스폰 된 프로세스를 갖고 싶습니다. 이것을 어떻게 할 수 있습니까? (그리고 호기심을 위해 : 1. 어디 기본적으로 양산 있습니다 2. 프로세스가 실행 위치를 확인할 수있는 방법이 있습니까??)MPI 프로세스를 생성 할 호스트 (순위) 지정

이 Other.py에 대한 나의 코드는 다음 (더 MWE)를 포함하지

from mpi4py import MPI 
comm = MPI.COMM_WORLD     
rank = comm.Get_rank() 
... 
icomm = MPI.COMM_SELF.Spawn(sys.executable,args["front_process.py",str(rank)],\ 
maxprocs=1) 

Spawn에 info와 argument를 제공하면 정상적으로 스폰 된 프로세스를 넣을 위치를 제어 할 수 있습니다. 이 "정보"를 추가 할 때

myinfo = MPI.Info.Create() 
myinfo.Set("host","%s" % str(rank)) 
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["front_process.py",str(rank)],\ 
maxprocs=1,info=myinfo) 

그러나, MPI가 충돌 (어떤 호스트 목록이 제공되지 않을 경우 또는 로컬 호스트) All nodes which are allocated for this job are already filled.

답변

0

새로운 프로세스가 제공된 호스트 목록에 정의 된 슬롯에 따라 스폰 할당 규칙 (일반적으로 mpiexec에 대한 인수로 제공됨). MPI 작업이 리소스 관리자 (RM)의 감독하에 실행되는 경우 (예 : SGE, LSF 등을 포함하고 MPI 라이브러리가 RM과 긴밀하게 통합 된 경우 호스트 목록과 사용 가능한 슬롯은 RM에 의해 고정되고 MPI_Info 객체의 host 키는 RM 지정 목록에 대한 필터로 사용됩니다 Open MPI에서 적어도 사실 임).

RM을 사용하지 않는 경우 각 호스트에 대해 충분한 슬롯이 정의 된 호스트 목록을 제공해야합니다. Open MPI 1.6.x에서는 add-host 키를 사용하여 새로운 호스트를 목록에 추가 할 수 있습니다. RM 하에서 실행중인 경우 적절한 요청을해야합니다 (이는 사이트 별).

프로세스가 실행되는 위치를 확인하려면 MPI.Get_processor_name()을 사용하십시오. 대부분의 클러스터 시스템에서는 호출 프로세스가 실행되는 노드의 호스트 이름을 반환합니다.

+1

현재 하나의 프로세서가있는 멀티 코어 시스템에서만 테스트됩니다. 하지만 정보를 제공 할 때 코드가 왜 충돌하는지 ('이 작업에 할당 된 모든 노드는 이미 채워져있다 ') 궁금해 지지만 정보를 제공하지 않을 때는 그렇지 않습니다. 모든 프로세서가 점유되어야한다 ('mpiexec -n 2 code.py'와 4 개의 스폰 된 프로세스) – user989762