Weryfikacja oprogramowania, korzystajacego z MPI

Podobne dokumenty
Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Jak wygląda praca na klastrze

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak dla PR PP

Programowanie współbieżne... (4) Andrzej Baran 2010/11

Programowanie w standardzie MPI

51. Metody komunikacji nieblokującej.

Aplikacja Sieciowa wątki po stronie klienta

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1

Operacje grupowego przesyłania komunikatów

5. Model komunikujących się procesów, komunikaty

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Przykład MPI: zbiór Mandelbrota

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Miary Wydajności. Efektywność programu równoległego (E) jest definiowana jako stosunek przyśpieszenia do liczby procesorów

Równoległość i współbieżność

Równoległość i współbieżność

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie Współbieżne

Algorytmy i Struktury Danych

Programowanie współbieżne... (12) Andrzej Baran 2010/11

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Klient-Serwer Komunikacja przy pomocy gniazd

HPC na biurku. Wojciech De bski

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Programowanie współbieżne i rozproszone

Mechanizmy pracy równoległej. Jarosław Kuchta

Message Passing Interface

Konfiguracja serwera OPC/DDE KEPSServerEX oraz środowiska Wonderware InTouch jako klienta DDE do wymiany danych

asix4 Podręcznik użytkownika SAPIS7 - drajwer protokołu SAPIS7 Podręcznik użytkownika

Programowanie współbieżne Wykład 11 Wprowdzenie do MPI. Rafał Skinderowicz

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Stan globalny. Krzysztof Banaś Systemy rozproszone 1

Przetwarzanie rozproszone

1 second UPS. Poziom trudności: łatwy. Wersja dokumentacji: 1.3. Aktualizacja: Beckhoff Automation Sp. z o. o.

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Programowanie współbieżne Wykład 12 MPI c.d. Rafał Skinderowicz

Tworzenie prostej etykiety i synchronizacja etykiet z wagą. AXIS Sp. z o.o. Kod produktu:

Ćwiczenie nr: 9 Obliczenia rozproszone MPI

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

Metody Metody, parametry, zwracanie wartości

Języki formalne i techniki translacji

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Operacje kolektywne MPI

Wykład 1. Systemy przekazywania wiadomości z założeniem bezbłędności działania

Paradygmaty programowania. Paradygmaty programowania

Przesyłania danych przez protokół TCP/IP

Działanie i charakterystyka sterownika GE FANUC VersaMaxNano

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Wywoływanie procedur zdalnych

Wywoływanie procedur zdalnych

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

O superkomputerach. Marek Grabowski

Obliczenia rozproszone z wykorzystaniem MPI

Laboratorium Komputerowe Systemy Pomiarowe

Pliki. Operacje na plikach w Pascalu

ArtPlayer oprogramowanie do odtwarzania plików video sterowane Artnet/DMX V1.0.1

Satel Integra FIBARO

Wstęp do programowania 2

61 Topologie wirtualne

Podstawy Programowania C++

Laboratorium nr 10. Temat: Funkcje cz.2.

Optymalizacja komunikacji w systemach rozproszonych i równoległych

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Rozszerzenia MPI-2 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Język C, tablice i funkcje (laboratorium, EE1-DI)

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski

Tworzenie aplikacji w języku Java

Algorytmy Równoległe i Rozproszone Część VI - Systemy rozproszone, podstawowe pojęcia

Losowość w rozproszonym modelu

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

PHP: bloki kodu, tablice, obiekty i formularze

1 Podstawy c++ w pigułce.

Łagodne wprowadzenie do Message Passing Interface (MPI)

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Zadanie 2: transakcyjny protokół SKJ (2015)

FAQ: /PL Data: 09/06/2012. Zastosowanie zmiennych Raw Data Type WinCC v7.0

Wskaźniki w C. Anna Gogolińska

Wywoływanie procedur zdalnych

Transkrypt:

Weryfikacja oprogramowania, korzystajacego z MPI Krzysztof Nozderko kn201076@students.mimuw.edu.pl 23 maja 2005

Wprowadzenie Równoległe obliczenia olbiczenia naukowców sa często bardzo kosztowne obliczeniowo oprogramowanie naukowe często korzysta ze współbieżności obliczenia sa dzielone między różne komputery komunikacja między współbieżnymi procesami poprzez interfejs MPI (Message Passing Interface)

Przykładowy program naukowy Diffusion2d program wylicza funkcję u : X Y Z dziedzina funkcji u jest dyskretna, dwuwymiarowa funkcja u ewoluuje - wartości funkcji zmieniaja się w kolejnych krokach zmiany te sa opisane przez jakieś równania obliczone wartości funkcji sa okresowo zapisywane

Message-Passing Interface MPI - co to jest? standard, definujacy składnię i semantykę dla biblioteki funkcji, wykorzystywanych do komunikacji między współbieżnymi procesami poczatki w latach 90-tych pierwsze biblioteki dla programów w C i Fortranie obecnie dostępne różne open-source owe implementacje wysokiej jakości rzeczywisty standard dla równoległego oprogamowania naukowego

MPI - podstawy jest wiele autonomicznych programów, każdy wykonuje swój własny kod komunikacja między nimi poprzez wywołanie funkcji MPI standard zawiera 140 funkcji, my omówimy kilka najprostszych wykorzystywanych przez Diffusion2d Pojęcia komunikator (communicator) - opisuje zbiór procesów, które moga się ze soba komunikować jeśli komunikator zawiera n procesów numeruje je sobie od 0 do n - 1 MPI COMM WORLD - predefinowany komunikator zawierajacy wszystkie procesy rank (rank) - identyfikator procesu w obrębie komunikatora

Wysyłanie i odbieranie MPI SEND(buf, count, datatype, dest, tag, comm) MPI RECV(buf, count, datatype, source, tag, comm, status) buf tablica z danymi do wysłania / gdzie otrzymane dane będa skopiowane count ile danych chcę wysłać / co najwyżej ile danych mogę otrzymać datatype typ danych które wysyłam / dostaję dest rank procesu do którego wysyłam source rank procesu od którego odbieram tag by można było rozróżniać wiadomości (id wiadomości) comm komunikator status parametr wyjściowy, zawiera informacje o otrzymanej wiadomości W przypadku odbierania wiadomości source i tag moga być odpowiednio MPI ANY SOURCE i MPI ANY TAG

Komunikacja MPI dostarcza różnych funkcji do przesyłania komunikatów synchronicznie i asynchronicznie, w różnych trybach komunikaty wysyłane przez jeden proces do drugiego procesu odbierane sa w prawidłowej kolejności komunikaty wysłane przez różne procesy do tego samego odbiorcy moga być odebrane w dowolnej kolejności Jednoczesne wysłanie i odebranie wiadomości MPI SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status) (proces rozdziela się na 2 niezależne watki) Synchronizacja wszystkich procesów z komunikatora MPI BARRIER(comm)

Diffusion2d - sieć procesów procesy zorganizowane sa w prostokatn a, cykliczna sieć M N dziedzina funkcji jest podzielona na kawałki (rozmiaru nxl nyl) każdy proces ma jeden swój kawałek dziedziny, za która jest odpowiedzialny wartość funkcji zależy od poprzednich wartości sasiaduj acych z nim pól każdy proces posiada ghost-cells kopię (wzięta od sasiadów) wartości funkcji u dla argumentów przyległych do jego kawałka dziedziny; z pewna częstotliwościa wyniki obliczeń musza być zasejwowane globalnie wiersz po wierszu

Geometria sieci

Diffusion2d deklaracja zmiennych /* wymiary sieci, czestotliwosc zapisu, ilosc iteracji */ int nprocsx, nprocsy, nxl, nyl, nprint, nsteps; /* id procesu, jego rzutowanie na wspolrzedne */ int myproc, mycoord0, mycoord1; /* identyfikatory sasiadow */ int uppernabe, lowernabe, leftnabe, rightnabe; int[,] u; /* funkcja u */ /* bufory do komunikacji*/ int[] send_buf, recv_buf, buf;

Diffusion2d main() [1/3] void main() { int iter = 0; //read nprocsx, nprocsy, nxl, nyl, nprint, nsteps MPI_Init(); myproc = MPI_Comm_Rank(); mycoord0 = myproc % nprocsx; mycoord1 = myproc / nprocsx;

Diffusion2d main() [2/3] uppernabe = mycoord0 + nprocsx*((mycoord1 + 1)%nprocsy); lowernabe = mycoord0 + nprocsx* ((mycoord1 + nprocsy - 1)%nprocsy); leftnabe = (mycoord0 + nprocsx - 1)%nprocsx + nprocsx*mycoord1; rightnabe = (mycoord0 + 1)%nprocsx + nprocsx*mycoord1; send_buf = new int[nxl]; recv_buf = new int[nxl]; buf = new int[nxl]; u = new int[nxl+2, nyl+2];

Diffusion2d main() [3/3] setinitialvalues(); exchangeghostcells(); MPI_Barrier(); for (iter = 1; iter <= nsteps; ++iter) { update(u); exchangeghostcells(); if ((iter % nprint) == 0) grid_write(); } MPI_Barrier(); MPI_Finalize(); } /* koniec main-a*/

Diffusion2d exchangeghostcells() void exchangeghostcells() { for(int i = 1;i <= nxl; ++i) send_buf[i-1] = u[i,1]; MPI_Sendrecv(send_buf,lowerNabe, recv_buf,uppernabe); for(int i = 1;i <= nxl; ++i)u[i,nyl+1] = recv_buf[i-1]; for(int i = 1; i <= nxl; ++i) send_buf[i-1] = u[i,nyl]; MPI_Sendrecv(send_buf, uppernabe, recv_buf, lowernabe); for(int i = 1;i <= nxl; ++i) u[i,0] = recv_buf[i-1]; for(int j = 1;j <= nyl; ++j) send_buf[j-1] = u[1,j]; MPI_Sendrecv(send_buf, leftnabe, recv_buf, rightnabe); for(int j = 1; j <= nyl; ++j)u[nxl+1,j]=recv_buf[j-1]; for(int j = 1; j <= nyl; ++j) send_buf[j-1] = u[nxl,j]; MPI_Sendrecv(send_buf, rightnabe, recv_buf, leftnabe); for(int j = 1; j <= nyl; ++j) u[0,j] = recv_buf[j-1]; }

Diffusion2d grid write() void grid_write() { if (myproc!= 0) { for (int n = 0; n < nprocsy; ++n) if (mycoord1 == n) for (int j = 1; j <= nyl; ++j) for (m = 0; m < nprocsx; ++m) if (mycoord0 == m) MPI_Send(u[1..nxl,j],0); } else { for (n = 0; n < nprocsy; ++n) for (int j = 1; j <= nyl; ++j) for (int m = 0; m < nprocsx; ++m) { int from_proc = m + nprocsx*n; if (from_proc!= 0) MPI_Recv(buf, from_proc); else for(int i = 0; i < nxl; ++i) buf[i]=u[i+1,j]; disk_write(buf); } } MPI_Barrier(); }

Własności DeadlockFree - program nigdy się nie zablokuje GlobalLockstep - proces może zaczać n-ty krok, dopiero gdy wszystkie pozostałe procesy oblicza już wartości funkcji w (n - 1) szym kroku LocalLockstep - proces może zaczać n-ty krok, dopiero gdy jego wszyscy sasiedzi oblicza już wartość funkcji w (n - 1) szym kroku Dla poprawności programu wystarczy by zachodziły DeadlockFree i LocalLockstep.

Pytania Q1: czy można usunać z kodu instrukcje MPI Barier? Q2: czy zapisy na dysk sa niezależne od przeplotu instrukcji oraz od sposobu buforowania komunikatów przez implementację MPI?

Przesyłanie komunikatów Modelowanie komunikacji użyjemy chan i j dla wysyłania wiadomości od procesu i-tego do j-tego ograniczymy wielkość kanału przez chan size Uzasadnienie program nie korzysta ze wszystkich możliwości MPI takich jak np. MPI ANY SOURCE i MPI ANY TAG MPI nie narzuca ograniczenia na wielkość buforów komunikacyjnych, ale w pewnych przypadkach możemy uzasadnić konkretny wybór chan size

Modelowanie komunikacji Modele komunikacji prosty gdy chan size = 0 złożony gdy chan size > 0 Prosty model komunikacyjny: /* chan_size = 0 */ inline MPI_Send(schan, msg) { schan!msg } inline MPI_Recv(rchan, rbuf) { rchan?rbuf }

Modelowanie komunikacji asynchronicznej w SPIN-ie kanały przechowuja wiadomości w kolejce FIFO standard MPI pozwala swym implentacjom w dowolnej chwili zsynchronizować komunikujace się strony Rozwiazanie MPI_Recv pozostawiamy więc bez zmian w MPI_Send dodajemy instrukcję, która może zablokować proces, aż kanał będzie pusty inline MPI_Send(schan, msg) { /* chan_size > 0 */ schan!msg; if :: 1 -> empty(schan) :: 1 fi }

Modelowanie jednoczesnego wysyłania i odbierania chan size > 0 inline MPI_Sendrecv(schan, msg, rchan, rbuf) { if :: schan!msg -> rchan?rbuf :: rchan?rbuf -> schan!msg fi; if :: 1 -> empty(schan) :: 1 fi } chan size = 0 trzeba dodać obsługę przypadku wysyłania do siebie samego inline MPI_Sendrecv(schan, msg, rchan, rbuf) { if :: (schan == rchan) -> rbuf = msg :: else -> if :: schan!msg -> rchan?rbuf :: rchan?rbuf -> schan!msg fi fi }

Modelowanie synchronizacji MPI BARRIER wprowadzamy dodatkowy proces i dodatkowy kanal synchroniczny zwykłe proces, by wejść wysyła kanałem 0, by wyjść wysyła 1 dodatkowy proces zbiera od zwykłych uczestników zera, a potem jedynki chan barrier_chan = [0] of {bit}; inline MPI_Barrier() { barrier_chan!0; barrier_chan!1 } active prototype Barrier() { end_b: do :: barrier_chan?0;...; barrier_chan?0; barrier_chan?1;...; barrier_chan?1 od } Etykieta end b - gdy pozostałe procesy się zakończa, SPIN nie uzna, że barrier się zablokował.

Modelowanie Diffusion2d nie będziemy modelować danych obliczanych przez program przesłanie wiadomości modelujemy jako wysłanie odpowiednim kanałem bitu 1 będzie nas interesować tylko ile komunikatów zalega w konkretnym kanale

Modelowanie własności SPIN ma wbudowana funkcjonalność sprawdzania deadlock-u pozostaje jeszcze wymodelować własności lockstep

Lockstep far(i, j) predykat prawdziwy, gdy proces i chce wykonać update(u), a proces i-ty wyprzedza j-ty o więcej niż jeden krok dodajemy etykietę Calculate przed wywyłaniem update(u) wprowadzamy zmienne globalne iter_i, iter_j dodajemy #define far_i_j (proc_i@calculate && (iter_i - iter_j > 1))

Lockstep Lockstep(i, j) żadanie by far(i, j) było zawsze fałszywe dodajemy never claim: <>far_i_j GlobalLockstep = Lockstep(i, j) i j LocalLockstep = Lockstep(i, j) i j sasiedzi

Inne podejście do Lockstep calc(i, n) predykat prawdziwy, gdy proces i chce wykonać update(u), a wrtościa zmiennej iter_i jest n #define calc_i_n (proc_i@calculate && (iter_i == n)) Lockstep(i, j; n) - calc(i, n) jest poprzedzone przez calc(j, n - 1) never claim: (!calc(j, n - 1)) U calc(i, n) Lockstep(i, j) = n Lockstep(i, j; n)

Używamy SPIN-a Opcje SPIN-a: -DSAFETY wszystkie własności dotycza bezpieczeństwa -DNOFAIR uczciwość nie jest potrzebna -DCOLLAPSE dla lepszej kompresji Przyjmujemy domyślnie nxl = nyl = 1 nprint = nsteps = 2

Wyniki weryfikacji DeadlockFree zachodzi szybko może zabraknać pamięci - już przy konfiguracji 4 4, nawet gdy chan size = 0 (przy dostępnych 3GB) bariery 4 3, chan size = 0 (na procesorze 2.2GHz) z barierami - 3.8 10 6 stanów, 153MB, 3 minuty bez barier - 1.5 10 6 stanów, 60MB, troszkę ponad minutę prosta/złożona komunkacja dla 4 2, bez barier chan size = 1-2.8 10 7 stanów chan size = 0-9.6 10 4 stanów

Wyniki weryfikacji LocalLockstep zachodzi nie zależy od modelu komunikacji

Wyniki weryfikacji GlobalLockstep nie zachodzi! nprocsx 4 lub nprocsy 4 chan size 1 nsteps 2 Przy takich warunkach, pewien proces może rozpoczać obliczanie u 2 podczas, gdy niektóre nie obliczyły jeszcze u 1.

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Kontrprzykład dla GlobalLockstep, dla 4 1

Wnioski z rozważań teoretycznych wystarczy więc sprawdzać deadlock-free dla chan size = 0 możemy więc usunać bariery - nie wpływa to na bycie deadlock-free zapisy na dysk sa poprawne

Literatura Stephen F. Siegel, George S. Avrunin Verification of MPI-Based Software for Scientific Computation http://laser.cs.umass.edu/ siegel/projects Message-Passing Interface Standard 2.0 http://www.mpi-forum.org/docs