MPI
MPI - Protokół komunikacyjny będący standardem przesyłania komunikatów pomiędzy procesami programów równoległych działających na jednym lub więcej komputerach.
Interfejs ten wraz z protokołem oraz semantyką specyfikuje, jak jego elementy winny się zachowywać w dowolnej implementacji.
Celami MPI są wysoka jakość, skalowalność oraz przenośność.
MPI jest dominującym modelem wykorzystywanym obecnie w klastrach komputerów oraz superkomputerach.
Funkcje MPI:
- MPI_Init – musi być wywołana na początku program
- MPI_Finalize – musi być wywołana przed zakończeniem programu
- MPI_Comm_size – pobiera rozmiar danego komunikatora, jeżeli jest używany z MPI_COMM_WORLD zwraca liczbę wszystkich procesów w programie
- MPI_Comm_rank – zwraca stopień/rangę wywoływanego procesu
- MPI_Reduce – wykonuje określone działanie na wynikach częściowych otrzymanych w procesach i zapisuje wynik tej operacji na jednym procesie
- MPI_Allreduce – analogicznie do MPI_Reduce, lecz wynik zapisywany jest do wszystkich procesów
- MPI_Probe – blokujący; pozwala na podejrzenie nadchodzącej wiadomości bez odbierania jej
- MPI_Iprobe – nieblokujący wersja MPI_Probe; flag = true, jeśli wiadomość może być odebrana
- MPI_Cancel – pozwala na anulowanie nadchodzącej wiadomości (zwalania pamięć zajmowaną przez tą wiadomość)
- MPI_Request– zwracany po sfinalizowaniu komunikacji
Blokująca komunikacja “punkt-punkt”:
- MPI_Send – standardowy blokujący “send”; funkcja może blokować proces wysyłający do czasu, gdy wiadomość zostanie odebrana przez odbiorcę. Zależy to od czynników takich jak rozmiar wiadomości, liczba wiadomości wysłanych do odbiorcy, itd.
- MPI_Bsend – buforowany “send”; programista dostarcza bufor, który może być ponownie wykorzystany, gdy wiadomość została odebrana. Funkcja zwraca sterowanie po zapisaniu do bufora.
Inaczej: Buforowane blokujące wysyłanie. W odróżnieniu od zwykłej funkcji wysyłającej dane nie są kopiowane bezpośrednio do odbiorcy, lecz do specjalnie przygotowanego systemowego bufora. Funkcja zwraca sterowanie dopiero jeśli dane zostaną do niego skopiowane
- MPI_Ssend – synchroniczny blokujący “send”; funkcja nie zwróci sterowania do momentu, w którym odbiorca zacznie odbierać daną wiadomość
- MPI_Rsend – blokujący “ready send”; funkcja pozwalająca na optymalizację (pominięcie negocjacji bufora pomiędzy nadawcą a odbiorcą), wymaga jednak pewności, iż odpowiadająca funkcja odbiorcza została wcześniej wywołana.
- MPI_Recv – standardowe blokujące odbieranie danych
Nieblokująca komunikacja “punkt-punkt”:
- MPI_Isend –nieblokujący odpowiednik MPI_Send(); zaczyna wysyłać dane, wszystkie zapytania zapisuje w tablicy, a program w tym czasie wykonywany jest dalej
- MPI_Irsend - nieblokujący odpowiednik MPI_Rsend()
- MPI_Issend - nieblokujący odpowiednik MPI_Ssend()
- MPI_Ibsend - nieblokujący odpowiednik MPI_Bsend()
- MPI_Irecv – nieblokujący odpowiednik MPI_Recv()
Testowanie zakończenia komunikacji “punkt-punkt”:
- MPI_Wait – blokujący (czeka na zakończenie podanej operacji)
- MPI_Waitany – czeka na zakończenie którejkolwiek operacji z tablicy
- MPI_Waitall - czeka na zakończenie wszystkich operacji z tablicy
- MPI_Waitsome – czeka dopóki jakieś operacje się nie zakończą
- MPI_Test – działa jak MPI_Wait(), z tym że nie czeka na zakończenie operacji a zwraca true lub flase
- MPI_Testany – analogicznie do MPI_Waitany()
- MPI_Testall – analogicznie do MPI_Waitall()
- MPI_Testsome – analogicznie do MPI_Waitsome()
Komunikacja kolektywna:
- MPI_Barrier - synchronizacja
- MPI_Bcast - rozgłaszanie
- MPI_Scatter - rozsiewanie
- MPI_Scatterv - rozsiewanie w częściach
- MPI_Gather – zbieranie przez pojedynczy proces
- MPI_Gatherv – zbieranie przez pojedynczy proces do określonych lokalizacji
- MPI_Allgather - zbieranie przez wszystkie procesy
- MPI_Alltoall - zbieranie i rozsiewanie przez wszystkie procesy
- MPI_Get_count() - zwraca ilość (liczbę) elementów danego typu w zmiennej count
- MPI_StartAll - rozpoczyna zbiór kontekstów wiadomości (tabilicę uchwytów)
- MPI_Comm_Spawn - jest kolektywną operacją na rozmnażających się procesach. MPI_Comm_spawn tworzy interkomunikator, zawierający jako dwie grupy procesy rozmnażające (spawning processes) i procesy rozmnażane (spawned processes), za pomocą którego można komunikować się z rozmnożonymi procesami. Rozmnożone procesy mogą pobrać interkomunikator za pomocą MPI_Comm_get_parent()