동일한 노드에있는 프로세스를 그룹과 구분하는 MPI 및 Fortran을 사용하여 구현하려고합니다. MPI에는이를 식별 할 수있는 일상이 있습니까?노드 프로세스를 MPI 및 FORTRAN과 함께 분류하십시오.
저는 호스트 이름별로 이러한 프로세스를 분리 할 생각이 있습니다. 이는 사용중인 컴퓨터의 노드에서 동일합니다. 그러나 모든 클러스터에서 일반적인지는 알 수 없습니다.
동일한 노드에있는 프로세스를 그룹과 구분하는 MPI 및 Fortran을 사용하여 구현하려고합니다. MPI에는이를 식별 할 수있는 일상이 있습니까?노드 프로세스를 MPI 및 FORTRAN과 함께 분류하십시오.
저는 호스트 이름별로 이러한 프로세스를 분리 할 생각이 있습니다. 이는 사용중인 컴퓨터의 노드에서 동일합니다. 그러나 모든 클러스터에서 일반적인지는 알 수 없습니다.
아마도 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 버전이 있는지 확인하십시오.
환경이 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) 배열로 전달됩니다.
이 메커니즘은 Blue Gene/Q를 제외한 모든 기기에서 작동합니다. 프로세서 이름에는 노드 내부의 코어 번호가 포함됩니다. 당신은 이런 식으로 자신의 프로세서 이름을 구성 할 수 있습니다
를 BG에/Q 프로세스는 코어간에 마이그레이션 할 수 없기 때문에 코어 ID를 프로세서 이름에 포함시키는 것이 좋습니다. 크레이는 어때? 나는 꽤 오랫동안 하나를 사용할 기회가 없었습니다. –
내가 사용한 Cray는 Linux처럼 동작합니다. –
웨슬리, 감사합니다. 이것이 Open MPI에는 유용하지 않다는 것은 수치스러운 일입니다. 비록이 split type_이 어떻게 작동 하는지를 이해했는지보기 위해 예제를 만들어 보겠습니다. 4 개의 8 코어 노드에 32 개의 프로세스가 있습니다. 내 의도는 동일한 노드에있는 공유 메모리 프로세스를 기반으로 8 개의 코어로 이루어진 4 개의 그룹을 생성하는 것입니다. MPI_Comm_split_type을 사용할 수 있습니다. 이걸 사용하면 (예를 들어, 각 노드에 2 개의 그룹을 넣는) 8 개의 그룹을 만들 수 있습니까? –
네, 그렇게 할 수 있습니다. 각 그룹이 노드에 대해 로컬 인 8 개의 4 그룹을 만들려면 프로세스의 절반이 하나의 키를 제공하고 나머지 절반이 다른 키를 제공하도록 key 매개 변수를 사용해야합니다. 이것은 기존의 MPI_COMM_SPLIT 호출의 동작이었습니다. 따라서 여러분이 따라야 할 많은 튜토리얼이 있어야합니다. 새로운 유형 추가를 위해 비트를 추가하기 만하면됩니다. –
OpenMPI는 환경 변수 OMPI_COMM_WORLD_LOCAL_RANK 및 OMPI_COMM_WORLD_LOCAL_SIZE를 설정하여 노드를 공유하는 프로세스 수 ("로컬 크기")를 확인할 수 있습니다. –