2013-08-08 3 views
5

동일한 노드에있는 프로세스를 그룹과 구분하는 MPI 및 Fortran을 사용하여 구현하려고합니다. MPI에는이를 식별 할 수있는 일상이 있습니까?노드 프로세스를 MPI 및 FORTRAN과 함께 분류하십시오.

저는 호스트 이름별로 이러한 프로세스를 분리 할 생각이 있습니다. 이는 사용중인 컴퓨터의 노드에서 동일합니다. 그러나 모든 클러스터에서 일반적인지는 알 수 없습니다.

답변

6

아마도 MPI_COMM_SPLIT_TYPE을 (를) 확인하고 싶을 것입니다. 그것은 당신이 매개 변수로 전달할 당신이 split_type에 따라 기존의 의사 소통을 분할 할 수 있습니다 :

이 유형 : 지금

int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, 
         MPI_Info info, MPI_Comm *newcomm) 

, 유일한 split_type는 다음과 같이 표준에 정의 된 MPI_COMM_TYPE_SHARED입니다 공유기를 서브 통신자로 분할하며, 각각은 이 공유 메모리 영역을 생성 할 수 있습니다.

이것은 일반적으로 사용자가 요구하는 것과 동일하지만 두 번 확인해야합니다.

알아야 할 또 다른 사항은 MPI의 새로운 기능이므로 MPI의 모든 구현에서 사용할 수 없을 수도 있다는 것입니다. 나는 그것이 MPICH을 위해 유효하다는 것을 알고있다 그리고 파생 상품이다. AFAIK, Open MPI의 최신 버전에서는 제공되지 않습니다. 따라서 실제로 지원하는 MPI 버전이 있는지 확인하십시오.

+0

웨슬리, 감사합니다. 이것이 Open MPI에는 유용하지 않다는 것은 수치스러운 일입니다. 비록이 split type_이 어떻게 작동 하는지를 이해했는지보기 위해 예제를 만들어 보겠습니다. 4 개의 8 코어 노드에 32 개의 프로세스가 있습니다. 내 의도는 동일한 노드에있는 공유 메모리 프로세스를 기반으로 8 개의 코어로 이루어진 4 개의 그룹을 생성하는 것입니다. MPI_Comm_split_type을 사용할 수 있습니다. 이걸 사용하면 (예를 들어, 각 노드에 2 개의 그룹을 넣는) 8 개의 그룹을 만들 수 있습니까? –

+0

네, 그렇게 할 수 있습니다. 각 그룹이 노드에 대해 로컬 인 8 개의 4 그룹을 만들려면 프로세스의 절반이 하나의 키를 제공하고 나머지 절반이 다른 키를 제공하도록 key 매개 변수를 사용해야합니다. 이것은 기존의 MPI_COMM_SPLIT 호출의 동작이었습니다. 따라서 여러분이 따라야 할 많은 튜토리얼이 있어야합니다. 새로운 유형 추가를 위해 비트를 추가하기 만하면됩니다. –

+0

OpenMPI는 환경 변수 OMPI_COMM_WORLD_LOCAL_RANK 및 OMPI_COMM_WORLD_LOCAL_SIZE를 설정하여 노드를 공유하는 프로세스 수 ("로컬 크기")를 확인할 수 있습니다. –

0

환경이 MPI 3.0을 제공하지 않는 시스템에서 유사한 분할 기능을 구현했으며 여러 클러스터에서 아주 잘 작동합니다. MPI_GET_PROCESSOR_NAME을 사용하며 대부분의 클러스터 MPI 구현이 Open MPI 및 Intel MPI (MPICH를 기반으로하므로 다른 MPICH 파생 제품과 유사한 동작이 예상 됨)를 사용하여 노드의 FQDN을 반환한다는 사실에 의존합니다.

rank := MPI_COMM_RANK(communicator) 
prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL 
next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL 

proc_name := MPI_GET_PROCESSOR_NAME 

list := MPI_RECV(from prev_rank) 
IF (list does not contain proc_name) THEN 
    list := list + proc_name 
END IF 

colour := index of proc_name in list 
key := rank 

MPI_SEND(list to next_rank) 

MPI_COMM_SPLIT(communicator, colour, key, newcomm) 

이 코드는 기본적으로 고유 한 MPI 프로세서 이름 (호스트 이름)의 목록을 작성하고 각 프로세스는 일반적인 분할 기능을 위해 색상으로이 목록에 자사의 MPI 프로세서 이름의 위치를 ​​사용하여 의사 그것은 다음과 같이 작동 . 알고리듬의 C 구현에서리스트는 단순히 0 바이트를 구분 기호로 사용하여 모든 항목을 문자열로 연결 한 것입니다. 포트란에서 호스트 이름에 일반적으로 허용되지 않는 기호를 사용할 수 있습니다 (예 : ;. 그런 다음 문자열은 MPI_CHAR (C) 또는 MPI_CHARACTER (Fortran) 배열로 전달됩니다.

+0

이 메커니즘은 Blue Gene/Q를 제외한 모든 기기에서 작동합니다. 프로세서 이름에는 노드 내부의 코어 번호가 포함됩니다. 당신은 이런 식으로 자신의 프로세서 이름을 구성 할 수 있습니다

+0

를 BG에/Q 프로세스는 코어간에 마이그레이션 할 수 없기 때문에 코어 ID를 프로세서 이름에 포함시키는 것이 좋습니다. 크레이는 어때? 나는 꽤 오랫동안 하나를 사용할 기회가 없었습니다. –

+0

내가 사용한 Cray는 Linux처럼 동작합니다. –