Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065
Wstęp MPI to standard przesyłania wiadomości (komunikatów) pomiędzy procesami programów równoległych działających na jednym lub więcej komputerach. Standardy: Wersja MPI 1.0 Wersja MPI 2.0 Rys.: Maszyna wirtualna MPI. Zadanie P1 z węzła 1 komunikuje się z zadaniem P5 z węzła 2
Własności MPI Standard obejmuje: 1. Używane typy danych 2. Komunikację punkt punkt 3. Operacje grupowe 4. Zarządzanie otoczeniem 5. Tworzenie procesów i zarządzanie nimi 6. Równoległe wejście / wyjście 7. Łączenie z językami C, C++, Fortran 8. Interfejs do profilowania aplikacji
Grupy Grupa jest zbiorem procesów. Każdy proces w grupie jest identyfikowany przez indeks. Gdy w grupie jest N procesów to ich indeksy są kolejnymi liczbami z przedziału 0 do N-1. Grupa jest identyfikowana przez uchwyt MPI_Group. Istnieje predefiniowana grupa pusta identyfikowana przez uchwyt MPI_GROUP_EMPTY
Komunikatory Komunikator tworzy grupa procesów oraz kontekst ich wykonania. Jest to grupa procesów, które mogą się ze sobą komunikować. Tworzenie nowego komunikatora -Poprzez podział -Poprzez grupę procesów Charakterystyka komunikatora Uchwyt Rozmiar (size) Charakterystyka procesu Rank
Komunikatory Komunikator Podział komunikatora na dwie części
Komunikacja punkt - punkt MPI_Send - Synchroniczne wysłanie komunikatu MPI_Recv - Synchroniczny odbiór komunikatu Proces wysyłający pozostaje zablokowany do chwili odebrania komunikatu MPI_Recv powoduje zablokowanie procesu bieżącego o ile brak procesu wysyłającego komunikat.
Synchronizacja w komunikacji punkt - punkt Ze względu na współdziałanie strony nadającej i odbierającej: Komunikacja synchroniczna nadawca czeka aż odbiorca przystąpi do odbioru Komunikacja asynchroniczna gdy odbiorca nie jest gotowy to nadawca umieszcza komunikat w buforze. Ze względu na blokowanie: Komunikacja blokująca powrót z funkcji wysyłania / odbioru następuje po zakończeniu działań funkcji Komunikacja nie blokująca powrót z funkcji wysyłania / odbioru następuje natychmiast
Buforowanie W komunikacji asynchronicznej musza być użyte bufory. Do przydziału i zwalniania buforów służą funkcje: Przydział bufora MPI_Buffer_attach Funkcja tworzy bufor. Jego wielkość powinna być nie mniejsza niż rozmiar pojedynczego komunikatu. Zwolnienie bufora MPI_Buffer_dettach Funkcja zwalnia utworzony wcześniej bufor.
Tryby komunikacji W zależności od kombinacji opcji współdziałania i buforowania występuje wiele rodzajów funkcji. Tryby komunikacji Synchroniczny Buforowany Przygotowany
Tryb Synchroniczny MPI_Ssend - Proces wysyłający blokowany do czasu gdy proces odbierający zakończy odbiór. Rys.: Tryb Synchroniczny
Tryb buforowany Proces wysyłający przesyła dane do bufora skąd pobiera je proces odbierający. MPI_Ibsend - Nieblokujące buforowane wysłanie komunikatu Rys.: Tryb buforowany
Tryb przygotowany komunikat może być wysłany tylko wtedy, gdy wcześnie została już wywołana funkcja odbierająca. Jeśli ten warunek nie jest spełniony, funkcja zwraca błąd. Rys.: Tryb przygotowany
Komunikacja nieblokująca Funkcja zwraca sterowanie od razu nie czekając na wykonanie operacji. Odbieranie nieblokujące - MPI_Irecv Testowanie zakończenie operacji odbioru MPI_Wait - blokujące testowanie zakończenia operacji MPI_Test - nieblokujące testowanie zakończenia operacji
Jednoczesne wysyłanie i odbieranie W MPI istnieje funkcja MPI_Sendrecv która umożliwia wysłanie komunikatu i oczekiwanie na odpowiedź.
Komunikacja Grupowa Bariera Jeden do wielu Jeden do wielu w Grupie Odbiór od wielu w grupie
Bariera
Jeden do wielu MPI_Bcast Funkcja powoduje przesłanie komunikatu umieszczonego w buforze buffer od procesu root do wszystkich procesów komunikatora. Proces root może być dowolnym procesem z komunikatora.
Jeden do wielu w grupie MPI_Scatter - rozsyłanie wektora danych do grupy procesów Proces o numerze root dzieli wektor na n elementów i rozsyła te fragmenty do wszystkich procesów komunikatora comm łącznie z sobą samym. Podwektory te są umieszczane w buforach. Wszystkie podwektory mają tę samą długość.
Odbiór od wielu w grupie MPI_Gather - odbieranie wektora danych do grupy procesów Każdy z procesów grupy wysyła podwektor danych o długości x umieszczony w buforze. Proces o numerze root zbiera te dane i umieszcza w buforze własnym. Dane umieszczane są w kolejności zgodnej z numerami nadawców.
Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065