MPI lab4 opracowanie odpowiedz

Message Passing Interface (MPI) (z ang. Interfejs Transmisji Wiadomości) – 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. Pierwsza wersja standardu ukazała się w maju 1994 r. Standard MPI implementowany jest najczęściej w postaci bibliotek, z których można korzystać w programach tworzonych w różnych językach programowania, np. C, C++, Ada, Fortran.

Opis

MPI jest specyfikacją biblioteki funkcji opartych na modelu wymiany komunikatów dla potrzeb programowania równoległego. Transfer danych pomiędzy poszczególnymi procesami programu wykonywanymi na procesorach maszyn będących węzłami klastra odbywa się za pośrednictwem sieci.

Główny model MPI-1 nie wspiera koncepcji współdzielonej pamięci, MPI-2 wspiera (w sposób ograniczony) rozproszony system pamięci dzielonej. Mimo tego programy MPI są bardzo często uruchamiane na komputerach o współdzielonej pamięci.

Program w MPI składa się z niezależnych procesów operujących na różnych danych (MIMD). Każdy proces wykonuje się we własnej przestrzeni adresowej, aczkolwiek wykorzystanie pamięci współdzielonej też jest możliwe.

Zaletami MPI nad starszymi bibliotekami przekazywania wiadomości są przenośność oraz prędkość. Przenośność, ponieważ MPI został zaimplementowany dla każdej architektury opartej na rozproszonej pamięci. Prędkość, ponieważ każda implementacja jest zoptymalizowana pod sprzęt, na którym działa. Standard udostępnia zbiór precyzyjnie zdefiniowanych metod, które mogą być efektywnie zaimplementowane. Stał się on punktem wyjściowym do stworzenia praktycznego, przenośnego, elastycznego i efektywnego narzędzia do przesyłania komunikatów (ang. message passing). Standard MPI pozwala na jego zastosowanie zarówno w komputerach równoległych, jak i heterogenicznych sieciach stacji roboczych.

Standard nie zabrania, aby poszczególne procesy były wielowątkowe. Nie są też udostępnione mechanizmy związane z rozłożeniem obciążenia pomiędzy poszczególne procesy, z architekturą rozkładu procesorów, z dynamicznym tworzeniem i usuwaniem procesów. Procesy są identyfikowane poprzez ich numer w grupie w zakresie 0 .. groupsize – 1.



Główne własności MPI

Zalety MPI

Wady MPI

Interfejs MPI ma na celu dostarczenie wirtualnej topologii, synchronizacji oraz funkcjonalności komunikacji pomiędzy zestawem procesów (które zostały zmapowane do węzłów/serwerów/instancji komputerów) w niezależny od języka sposób, przy podobnej do niego składni. Programy MPI zawsze współpracują z procesami, aczkolwiek programiści powszechnie odnoszą się do procesów jako procesorów. Zazwyczaj dla uzyskania maksymalnej wydajności, każdy CPU (lub rdzeń w wielordzeniowym procesorze) ma przypisany pojedynczy proces. Przypisanie to ma miejsce w czasie rzeczywistym przez agenta, który uruchamia program MPI (zazwyczaj nazywany mpirun lub mpiexec).

Koncepcje

Komunikator

Komunikatory są obiektami łączącymi, tj. grupującymi procesy podczas sesji MPI. W obrębie każdego komunikatora każdy zawarty proces ma niezależny identyfikator, zaś same procesy organizowane są w uporządkowaną topologię.

Punkt – punkt

Szereg ważnych funkcji w API MPI dotyczy komunikacji pomiędzy dwoma określonymi procesami. Operacje punkt – punkt są szczególnie użyteczne w nieregularnej komunikacji, np. w architekturze opartej na równoległości danych, w której każdy procesor stale wymienia regiony danych z innymi określonymi procesorami pomiędzy kolejnymi krokami obliczeń. Innym przykładem jest architektura master-slave, w której master wysyła nowe dane zadania do slave’a niezależnie od tego, czy poprzednie zostało ukończone.

Funkcje zbiorowe

Funkcje zbiorowe w API MPI dotyczą komunikacji pomiędzy wszystkimi procesami w grupie procesów. Wywołania te są często używane na początku lub końcu dużych rozproszonych obliczeń, gdzie każdy z procesorów operuje na części danych, po czym łączy je w wynik.

Typy danych

Wiele funkcji MPI wymaga, ażeby określić typ danych, jaki jest przesyłany pomiędzy procesorami. Dzieje się tak, ponieważ argumentami funkcji są zmienne, nie zaś typy definiowane. Jeśli typ danych jest standardowy, jak np. int, char, double itd., można użyć predefiniowanych w MPI typów takich jak: MPI_INT, MPI_CHAR, MPI_DOUBLE. Dane mogą być również w postać klas lub struktur danych. Można wykorzystywać pochodne typy danych z typów predefiniowanych.

Komunikacja jednostronna (MPI-2)

MPI-2 definuje trzy operacje jednostronnej komunikacji: Put, Get i Accumulate, które to umożliwiają zapis do zdalnej pamięci, odczyt z niej oraz zmniejszają liczbę operacji pamięci dla wielu zadań. Definiowane są również trzy różne metody dla synchronizacji komunikacji – globalna, parami oraz przy wykorzystaniu zdalnych blokad – specyfikacja nie gwarantuje jednak, iż operacje te będą wykonywane aż do momentu punktu synchronizacji.

Dynamiczne zarządzanie procesami (MPI-2)

Kluczowym aspektem dynamicznego zarządzania procesami w MPI-2 jest zdolność procesów do tworzenia nowych procesów bądź ustanowienia komunikacji z procesami, które rozpoczęły się oddzielnie.

MPI I/O (MPI-2)

Równoległe I/O wprowadzone w MPI-2 jest często nazywane w skrócie MPI-IO oraz odnosi się do zbioru funkcji przeznaczonych do ułatwienia zarządzania I/O w systemach rozproszonych w sposób abstrakcyjny oraz umożliwienia łatwego dostępu do plików korzystając z funkcjonalności istniejących typów pochodnych.


1. Ogólna koncepcja systemu

a) Podstawy


MPI realizuje model przetwarzania współbieżnego zwany MIMD ( Multiple Instruction Multiple Data), a dokładniej SPMD (Single Program Multiple Data). Zakłada on, że ten sam kod źródłowy wykonuje się jednocześnie na kilku maszynach i procesy mogą przetwarzać równocześnie różne fragmenty danych, wymieniając informacje przy użyciu komunikatów

Takie podejście ma wiele zalet, z których najbardziej spektakularną jest chyba możliwość współbieżnych obliczeń wykonywanych na maszynach o zupełnie różnych architekturach (np. Linux-x86 oraz Solaris-Sparc).


Realizując ten model, MPI umożliwia:

Wszystkie te rzeczy są realizowane przy minimalnym stopniu skomplikowania kodu źródłowego.


b) Komunikaty


Przy przesyłaniu komunikatów między procesami MPI stara się zachować niezależność od platformy (np. kolejności bajtów). Dla standardowych typów jest to proste, natomiast dla typów niestandardowych MPI dostarcza funkcje pozwalające na zdefiniowanie typów użytkownika dla potrzeb przesyłania komunikatów.

Możliwe jest adresowanie komunikatów zarówno do konkretnych procesów, jak i do określonych grup odbiorców. Dostępne są funkcje do definiowania grup procesów i późniejszego rozsyłania komunikatów do tych grup. Komunikaty opatrzone są tagami pozwalającymi na późniejsze selektywne odbieranie ich z kolejki w zależności od rodzaju.

Możliwa jest wymiana komunikatów w trybie non-blocking pozwalającym na jeszcze większe zrównoleglenie obliczeń.

c) Zaawansowana komunikacja


Główną zaletą MPI przy bardziej złożonych schematach wymiany danych jest ukrywanie przed programistą szczegółów implementacyjnych oraz możliwość optymalizacji ścieżki przepływu danych. Wyobraźmy sobie przykładowo, że mamy 8 procesów i pierwszy z nich ma przekazać pewną porcję danych wszystkim pozostałym. Najprostsza możliwość:

jest oczywiście niezbyt optymalna - widać, że w ogólnym przypadku złożoność czasowa procesu przesyłania jest zależna liniowo od liczby procesów biorących udział w tej operacji.


Kolejny przykład jest już krokiem w dobrym kierunku - przesyłanie danych trwa dwukrotnie krócej niż poprzednio


Oczywiście i tak każdy wie, że optymalny schemat broadcastu danych w obrębie grupy procesów wygląda następująco :)


jednak zaletą MPI jest fakt, że takie decyzje (dotyczące wyboru dróg przesyłania danych) są ukryte przed programistą - może on po prostu założyć, że dane "kiedyś" i "jakoś" dotrą na miejsce przeznaczenia, a "kiedy" i "jak" - decyduje system i stara się to zrobić w sposób optymalny.

Wszystkie te rozważania można również przeprowadzić przeprowadzić w odwrotną stronę - dla agregacji danych z kilku procesorów. MPI definiuje zbiór funkcji służących do zbierania danych z kilku procesów. Typowy przykład to obliczanie sumy elementów wektora na podstawie zbioru sum częściowych (lub np. wyszukiwanie maksymalnego elementu).


2. Środowisko pracy

Z punktu widzenia programisty MPI składa się z dwóch części:

Najprostszy sposób kompilacji programu to użycie któregoś ze standardowych skryptów dostarczanych z MPI. Są to:

Uruchamianie programów w MPI jest równie proste i sprowadza się do uruchomienia skryptu mpirun. Jego jedynym interesującym nas w tej chwili parametrem jest -np <n>. Określa on ilość równoległych procesów, jakie ma uruchomić system w celu wykonania obliczeń.

Przed uruchomieniem mpirun musimy upewnić się, że w naszym katalogu domowym na wszystkich maszynach potencjalnie mogących wchodzić w grę przy wykonywaniu naszego programu w odpowiednim katalogu znajduje się kopia pliku wykonywalnego programu. Najczęściej w takich przypadkach stosuje się montowanie katalogów przez NFS.

Szczegóły techniczne ukryte za mechanizmem rozsyłania procesów na różne maszyny w zasadzie nas tu nie interesują, warto może tylko wspomnieć o ADI (Abstract Device Interface). Jest to wewnętrzny standard mpich określający sposób komunikacji między procesami na niskim poziomie.

Zaletą używania takiego modelu jest oddzielenie części systemu zależnej od konkretnej architektury, od części identycznej dla wszystkich. Wynika z tego na przykład, że ten sam program uruchomiony na maszynie wieloprocesorowej może używać do komunikacji pamięci wspólnej (shared memory), a wykonywany na klastrze kilku silnych pecetów używa TCP/IP bez rekompilacji kodu!



3. Ważniejsze funkcje MPI

a) Podstawy

Podstawowe funkcje służące do inicjalizacji/zamykania programu oraz do wysyłania najprostszych komunikatów (typu Point-to-point) to:





b) Rozsyłanie/zbieranie danych









c) Struktury danych

W zastosowaniach rzeczywistych najczęściej wysyłamy większą ilość danych, bądź to w strukturach, albo w postaci wektorów. Przesyłanie ich w postaci oddzielnych komunikatów powodowałoby powstanie dużego narzutu czasowego związanego z organizacją przesyłania danych. Potrzebna jest więc możliwość "pakowania" danych i wysyłania większej ich ilości za jednym razem.

W MPI jest to dość spory problem, gdyż najczęściej typ przesyłanych danych jest różny od standardowych typów zdefiniowanych w bibliotece. Zdecydowano się na rozwiązanie w którym programista ma możliwość tworzenia nowych typów danych w czasie wykonywania programu.



d) Grupowanie danych

Istnieje również prostsza metoda wysyłania większej ilości danych za jednym zamachem - polega ona na tym, że przed każdą operacją typu MPI_Send() ręcznie pakujemy wszystkie dane do jednego obszaru pamięci, a druga strona po odebraniu komunikatu może je rozpakować w analogiczny sposób. Odpowiednie funkcje mają następującą postać:

e) Synchronizacja

Podstawową (i najczęściej stosowaną) funkcją MPI służącą do synchronizacji procesów jest

Wywołanie jej w pewnym miejscu programu powoduje, będzie on czekał, aż wszystkie pozostałe jego instancje dojdą do tego miejsca i dopiero potem ruszy dalej.

Komunikacja non-blocking

MPI umożliwia, oprócz klasycznej komunikacji typu MPI_Send/ MPI_Recv również przesyłanie wiadomości bez blokowania programu. W skrócie wygląda to tak, że po wywołaniu funkcji MPI_Isend program może wykonywać inne czynności (oczywiście nie zmieniające bufora wysyłanego komunikatu), natomiast w chwili, gdy chce się upewnić, że komunikat został już wysłany w całości, wywołuje MPI_Wait, lub MPI_Test.

W podobny sposób realizowany jest odbiór komunikatów bez blokowania - analogiczna funkcja nosi nazwę MPI_Irecv.



Wyszukiwarka

Podobne podstrony:
MPI lab4 opracowanie odpowiedz
finanse lokalne opracowane odpowiedzi, Różne Dokumenty, MARKETING EKONOMIA ZARZĄDZANIE
PODSTAWY PRAWA, Prawo - test (opracowane odpowiedzi), 1
OPRACOWANE ODPOWIEDZI id 337615 Nieznany
CUDA lab2 opracowanie odpowiedz
Zbiór2 pytań wraz z opracowanymi odpowiedziami z przedmiot
opracowane odpowiedzi do zestawu 2
opracowane odpowiedzi na pytani Nieznany
finanse lokalne opracowane odpowiedzi--ściaga, Różne Dokumenty, MARKETING EKONOMIA ZARZĄDZANIE
prawo test opracowanie odpowiedzi 15, Agh kier. gig. rok 3 sem 6, podziemka podsadzka, sem VI, Prawo
Opracowane odpowiedzi część
OpenMP lab1 opracowanie odpowiedz
opracowane odpowiedzi, MRiT-Mechanika i Budowa Maszyn, Fizyka
kolo opracowanie odpowiedzi
Egzamin Podstawy Projektowania 12 opracowane odpowiedzi
OPRACOWANE ODPOWIEDZI
opracowane odpowiedzi do zestawu 1

więcej podobnych podstron