2013-08-08 29 views
5

Próbuję wykonać implementację za pomocą MPI i Fortran, które oddziela procesy, które są w tym samym węźle do grup. Czy MPI ma rutynę, która może to zidentyfikować?Klasyfikuj procesy węzłowe razem z MPI i FORTRAN

Wpadłem na pomysł oddzielenia tych procesów od ich nazw hostów, które są takie same w węzłach komputera, którego używam. Ale nie wiem, czy jest on ogólny dla wszystkich klastrów.

Odpowiedz

6

Prawdopodobnie chcesz sprawdzić MPI_COMM_SPLIT_TYPE. Pozwoli to, aby podzielić istniejącego komunikatora opartego na split_type przekazać jako parametr:

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

Teraz jedynym split_type jest MPI_COMM_TYPE_SHARED, zdefiniowane w normie jako:

Ten typ dzieli komunikator na podkomitety, z których każdy może utworzyć współużytkowany obszar pamięci.

Zwykle jest to to samo, o co prosisz, ale musisz dwukrotnie sprawdzić, czy to prawda na twoim komputerze.

Inną rzeczą, którą musisz wiedzieć, jest to, że jest to nowa funkcja w MPI-3, więc może nie być dostępna we wszystkich implementacjach MPI. Wiem, że jest dostępny dla MPICH i jego pochodnych. AFAIK, nie jest dostępny w ostatnim wydaniu Open MPI. Dlatego upewnij się, że masz wersję MPI, która ją obsługuje.

+0

Wesley, dziękuję. Szkoda, że ​​to nie jest dostępne dla Open MPI. Chociaż, pozwól mi zrobić przykład, aby sprawdzić, czy rozumiem, jak działa ten podział typu_. Dodatek Mam 32 procesy na 4 8-rdzeniowych węzłach. Moją intencją jest utworzenie 4 grup po 8 rdzeni, opartych na procesach pamięci współużytkowanej, które znajdują się w tym samym węźle. Mogę użyć typu MPI_Comm_split_type. Używając tego nie mogłem na przykład utworzyć 8 grup po 4 (umieszczając 2 grupy w każdym węźle), czy mogę? –

+0

Tak, możesz to zrobić. Jeśli chcesz utworzyć 8 grup po 4, gdzie każda grupa jest lokalna dla węzła, musisz użyć parametru kluczowego, aby połowa procesów przyczyniła się do jednego klucza, a druga połowa do innego klucza. To było zachowanie istniejącego połączenia MPI_COMM_SPLIT, więc powinno być mnóstwo tutoriali, które możesz zastosować. Musisz tylko dodać trochę do nowych dodatków typu. –

+0

OpenMPI ustawia zmienne środowiskowe OMPI_COMM_WORLD_LOCAL_RANK i OMPI_COMM_WORLD_LOCAL_SIZE, za pomocą których można dowiedzieć się, ile procesów współdzieli węzeł ("rozmiar lokalny"). –

0

Mam zaimplementowaną podobną funkcję podziału dla systemów, których środowisko nie zapewnia MPI 3.0 i działa całkiem dobrze w kilku klastrach. Używa ona MPI_GET_PROCESSOR_NAME i polega na tym, że większość wdrożeń MPI klastrów zwraca FQDN węzła jako wynik - testowany z Open MPI i Intel MPI (który jest oparty na MPICH, dlatego podobne zachowanie można się spodziewać z innymi pochodnymi MPICH). W Pseudokod to działa tak:

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) 

Ten kod zasadzie buduje listę unikalnych nazw procesorów MPI (nazwy hosta) i każdy proces wykorzystuje pozycję swojej nazwy procesora MPI na tej liście jako kolor dla zwykłej funkcji podziału . W mojej implementacji C algorytmu lista jest po prostu ciągiem - konkatenacją wszystkich elementów z zerowym bajtem jako separatorem. W Fortranie można użyć dowolnego symbolu, który normalnie nie byłby dozwolony w nazwie hosta, np. ;. Następnie ciąg jest po prostu przekazywany jako tablica z MPI_CHAR (C) lub MPI_CHARACTER (Fortran).

+0

Ten mechanizm działa na wszystkich maszynach, które spotkałem, z wyjątkiem Blue Gene/Q. Tam nazwa procesora zawiera numer rdzenia wewnątrz węzła. Można skonstruować własną nazwę procesora tak:

+0

Na BG/Q, procesy nie mogą migrować między rdzeniami, dlatego sensowne jest umieszczanie identyfikatora rdzenia w nazwie procesora. A co z Cray? Od pewnego czasu nie miałem okazji go używać. –

+0

The Crays, których używałem, zachowują się jak Linux. –