Dynamiczne zarzdzanie procesami Michał Sajkowski
literatura wykład opracowany na podstawie: W. Gropp, E. Lusk, R. Thakur, Using MPI-2, The MIT Press 1999 W. Gropp, E. Lusk, A. Skjellum, Using MPI, 2nd. Ed., The MIT Press 1999 2
troch historii co nowego w MPI-2: równoległe we/wy zdalne operacje na pamici dynamiczne zarzdzanie procesami 3
dynamiczne zarzdzanie procesami trzecim głównym odstpstwem od modelu MPI-1 jest zdolno procesu MPI do: udziału w tworzeniu nowego procesu MPI ustanowienia komunikacji z procesem MPI, który został uruchomiony oddzielnie 4
dynamiczne zarzdzanie procesami główne problemy, na jakie trafiamy przy projektowaniu API dla dynamicznego zarzdzania procesami: utrzymanie prostoty i elastycznoci współdziałanie z systemem operacyjnym, zarzdc zasobów, i zarzdc procesów w złoonym rodowisku programowym unikanie warunków wycigu, które naraaj na szwank poprawno 5
dynamiczne zarzdzanie procesami kluczem do tej poprawnoci jest to, aby operacje dynamicznego zarzdzania procesami były kolektywne, zarówno midzy procesami tworzcymi nowe procesy, jak pomidzy nowo utworzonymi procesami otrzymane zbiory procesów s reprezentowane w interkomunikatorze 6
dynamiczne zarzdzanie procesami interkomunikator komunikator zawierajcy dwie grupy procesów zamiast jednej dwie rodziny operacji oparte na interkomunikatorach: tworzca nowe procesy, nazywa si rozmnaaniem (spawning) ustalajca komunikacj z ju istniejcymi programami MPI nazywa si łczeniem (connecting) 7
dynamiczne zarzdzanie procesami ta ostatnia pozwala aplikacjom na posiadanie struktury równoległy klient /równoległy serwer szczegóły dynamicznego zarzdzania procesami - rozdział 7 ksiki Using MPI-2 8
dynamiczne zarzdzanie procesami dodatkowe kwestie: rozszerzone operacje kolektywne, dla interkomunikatorów (analogiczne do operacji w MPI-1 dla intrakomunikatorów) obsługa C++ i Fortran90, Fortranu na dwóch poziomach: podstawowym i rozszerzonym mieszane programowanie w wielu jzykach zewntrzne interfejsy do bibliotek itp. wtki 9
dynamiczne zarzdzanie procesami MPI-1 nie pozwala na dynamiczne zarzdzanie procesami MPI-2 realizuje to za pomoc funkcji MPI_Comm_spawn, która jest kolektywn operacj na rozmnaajcych si procesach (zwanych parents, rodzicami) i równie kolektywna przy wywołaniach MPI_Init w procesach rozmnaanych (zwanych children, dziemi) 10
dynamiczne zarzdzanie procesami standard MPI-1 nic nie mówi o tym, jak uruchamiane s procesy start procesu wystpuje poza programem MPI, proces MPI wywołujempi_comm_size, aby si dowiedzie ile procesów uruchomiono, oraz MPI_Comm_rank, aby si dowiedzie, który to proces liczba procesów jest ustalona nie póniej ni wtedy, gdympi_init zwraca warto 11
dynamiczne zarzdzanie procesami uytkownicy MPI prosili MPI Forum, aby wróci do tej kwestii, z powodów: migracji uytkowników z PVM i ich przyzwyczaje przy zarzdzaniu procesami wanych klas aplikacji klient serwer i task farming jobs, wymagajcych dynamicznego zarzdzania zadaniami moliwoci pisania rodowiska oblicze równoległych w samym MPI 12
dynamiczne zarzdzanie procesami - agenda tworzenie nowych procesów - kontynuacja MPI_Comm_spawn komunikacja midzy grupami w interkomunikatorze, dwupunktowa (MPI-1) i kolektywna (MPI-2) łczenie dwóch programów MPI, korzystajc z przykładu programu obliczeniowego i wizualizacyjnego mieszane programowanie dyskusja procedur dynamicznego zarzdzania procesami 13
tworzenie nowych procesów podstawy MPI_Comm_spawn wprowadzono na poprzednim kursie przypomnijmy, e MPI_Comm_spawn tworzy interkomunikator zawierajcy jako dwie grupy procesy rozmnaajce (spawning processes) i procesy rozmnoone (spawned processes) 14
tworzenie nowych procesów zbadamy MPI_Comm_spawn szczegółowo, stosujc ponownie przykład mnoenia macierzy z rozdziału 3 pierwszego tomu Using MPI z 1999 roku pokazano ten program jako przykład paradygmatu master-slave zaadaptujemy go, uywajc zmiennej liczby procesów slave, o których uruchomieniu decyduje proces master 15
interkomunikatory dokonamy wpierw przegldu pojcia interkomunikatora interkomunikatory s mało widoczne w MPI-1, ale znaczce w MPI-2, szczególnie w zarzdzaniu procesami zwykły komunikator w MPI jest intrakomunikatorem, składa si z kontekstu i grupy procesów 16
interkomunikatory wyróniajc cech interkomunikatora jest to, e jest zwizany z dwoma grupami procesów, lokaln i zdaln, z punktu widzenia konkretnego procesu procesy s identyfikowane przez numer w grupie, ale komunikat nadany do procesu o danym numerze zawsze trafia do procesu w grupie zdalnej 17
interkomunikatory takie zachowanie si operacji dwupunktowych jest specyfikowane w MPI-1 MPI-1 nie specyfikuje zachowania operacji kolektywnych w interkomunikatorach, a MPI-2 to robi podobnie, jak w przypadku dwupunktowym, komunikacja zachodzi midzy dwoma grupami 18
interkomunikator na rysunku proces 0 z grupy lokalnej przesyła komunikat do procesu 1 w grupie zdalnej 0 0 1 2 1 2 19
przykład: mnoenie macierzy ten sam algorytm co w ksice Using MPI, z tym, e zamiast uruchamia wszystkie procesy poza programem, uruchamiamy jedynie proces nadrzdny master i pozwalamy mu, aby on uruchamiał procesy podległe slave za pomoc funkcji MPI_Comm_spawn 20
mnoenie macierzy oznacza to, e zasadnicz rónic midzy t wersj, a wersj poprzedni MPI-1, jest to, e proces master i procesy slave s oddzielnymi głównymi programami rozwamy pocztek kodu programu dla procesu master, uruchamiany poleceniem mpiexec n 1 master 21
mnoenie macierzy master cz.1! mnoenie macierzy z rozmnaaniem procesów slave PROGRAM main use mpi integer MAX_ROWS, MAX_COLS parameter (MAX_ROWS = 1000, MAX_COLS = 1000) double precision a(max_rows_,max_cols), b(max_cols), c(max_rows) double precision buffer(max_cols), ans integer slavecom integer ierr, status(mpi_status_size) integer i, j, numsent, sender, numslaves integer anstype, rows, cols 22
mnoenie macierzy master cz.1 call MPI_INIT(IERR)! master decyduje, ile procesów slave rozmnoy numslaves = 10 call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, numslaves, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, &! master inicjuje i nastpnie rozsyła rows = 100 cols = 100! inicjalizuj a i b do 20 j = 1,cols b(j) = 1 do 10 i = 1,rows slavecomm, MPI_ERRCODES_IGNORE, ierr) 23
mnoenie macierzy master cz.1 10 continue 20 continue numsent = 0 a(i,j) = i! nadaj b do kadego procesu slave call MPI_BCAST(b, cols, MPI_DOUBLE_PRECISION, MPI_ROOT, & slavecomm, ierr) 24
mnoenie macierzy master cz.1 program ten mnoy macierzaprzez wektorbi pamita wynik wc równoległo wynika faktu, e iloczyn skalarny wierszy macierzy a przez wektor b odbywa si równolegle zakładamy, e jest wicej wierszy w macierzy a ni procesów, std kady proces wykonuje wiele iloczynów procesy nie pracuj z t sam szybkoci 25
mnoenie macierzy master cz.1 program master nadaje wiersze, jeden po drugim, do procesów slave, a kiedy proces slave zakoczy liczenie, przesyła wynik (iloczyn skalarny) do procesu master okrelamy liczb procesów slave dopiero, gdy proces master wystartuje, pokazujc działanie MPI_Comm_spawn i MPI_Bcast na interkomunikatorze nowe zmienne to interkomunikatorslavecomm, stworzony przez MPI_Comm_spawn, oraz zmienna numslaves, przechowujca liczb procesów slave 26
mnoenie macierzy master cz.1 program tego typu wykonuje pewien rodzaj oblicze, aby wyznaczy liczb procesów slave, które naley rozmnoy (spawn) aby to uproci, na razie zakładamy, e program decyduje aby stworzy dziesi procesów slave i ustawiamy numslaves na warto 10 procesy s tworzone funkcjmpi_comm_spawn : call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, numslaves, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, & slavecomm, MPI_ERRCODES_IGNORE, ierr) 27
mnoenie macierzy master cz.1 call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, numslaves, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, & slavecomm, MPI_ERRCODES_IGNORE, ierr) funkcja ta (w wersji Fortran) ma 9 argumentów, 6 wejciowych i 3 wyjciowe: pierwszy to plik wykonywalny, uruchamiany przez nowe procesy, drugi to tablica bdca lini polece dla pliku wykonywalnego, trzeci to liczba procesów slave, które mamy uruchomi 28
mnoenie macierzy master cz.1 call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, numslaves, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, & slavecomm, MPI_ERRCODES_IGNORE, ierr) czwarty to informacja dodatkowa pity to process root, tutaj 0, bo jest tylko jeden proces master szósty to komunikator, na którym ta funkcja jest kolektywna, czyli MPI_COMM_WORLD 29
mnoenie macierzy master cz.1 call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, numslaves, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, & slavecomm, MPI_ERRCODES_IGNORE, ierr) 3 argumenty wyjciowe to: siódmy to interkomunikator, tutaj slavecomm, zawierajcy proces master (w grupie lokalnej) i procesy slave (w grupie zdalnej) ósmy to wskazanie, e nie sprawdzamy pojedynczych kodów błdu dziewity to ogólny kod błdu zwracany przez funkcj, okrela czy funkcja jest sukcesem czy nie 30
operacje kolektywne w interkomunikatorze nastpnie proces master inicjuje macierzai wektor b i stosuje operacj kolektywn MPI_Bcast aby nadabdo procesów slave w MPI-1 było to niemoliwe, ale MPI-2 definiuje operacje kolektywne na interkomunikatorach, jak slavecomm rozgłaszanie jest realizowane przez proces root w grupie lokalnej do wszystkich procesów w grupie zdalnej, które w tym przypadku s procesami slave poniewa s dwie grupy, proces wskazuje siebie specjaln wartoci MPI_ROOT 31
operacje kolektywne w interkomunikatorze procesy odbierajce broadcast specyfikuj numer procesu root, tak jak by były w jednej grupie jeeli jest wicej ni jeden proces w grupie lokalnej, zawierajcej proces root, to te pozostałe procesy specyfikuj MPI_PROC_NULL jako warto root 32
operacje kolektywne w interkomunikatorze: rozgłaszanie 2 0 MPI_PROC_NULL 2 MPI_ROOT 2 1 MPI_PROC_NULL 2 3 MPI_PROC_NULL 2 33
komunikacja dwupunktowa w interkomunikatorze reszt kodu procesu master pokazano na kolejnych slajdach numery procesów s midzy0a numslaves-1, poniewa proces master je wskazuje w zdalnej grupie interkomunikatoraslavecomm, a nie jak w MPI-1 w MPI_COMM_WORLD 34
komunikacja dwupunktowa w interkomunikatorze proces master nadaje do wszystkich procesów slave wiersz, na którym maj działa, odbiera od nich odpowied, i przesyła do nich kolejne wiersze, a si wyczerpi nastpnie proces master nadaje komunikat z etykiet 0 do kadego procesu slave, aby wskaza, e obliczenia si skoczyły na koniec, proces master drukuje wektor c bdcy iloczynem a i b 35
mnoenie macierzy master cz.2! nadaj wiersz do kadego procesu slave;! etykietuj numerem wiersza do 40 i = 1,min(numslaves,rows) do 30 j = 1,cols buffer(j) = a(i,j) 30 continue call MPI_SEND(buffer, cols, MPI_DOUBLE_PRECISION, i-1, & i, slavecomm, ierr) numsent = numsent+1 40 continue 36
mnoenie macierzy master cz.2 do 70 i = 1,rows call MPI_RECV(ans, 1, MPI_DOUBLE_PRECISION, & sender = status(mpi_source) anstype = status(mpi_tag) c(anstype) if (numsent.lt. rows) then 50 continue do 50 j = 1,cols MPI_ANY_SOURCE, MPI_ANY_TAG, & slavecomm, status, ierr)! wiersz jest wartoci etykiety = ans! nadaj inny wiersz buffer(j) = a(numsent+1,j) call MPI_SEND(buffer, cols, MPI_DOUBLE_PRECISION, sender, & numsent+1, slavecomm, ierr) numsent = numsent+1 37
mnoenie macierzy master cz.2 else call MPI_SEND(buffer, 0,MPI_DOUBLE_PRECISION, sender, & 0, slavecomm, ierr) endif 70 continue! drukuj odpowied do 80 i = 1,rows print *, c( i, ) =, c(i) 80 continue call MPI_COMM_FREE(slavecomm, ierr) call MPI_FINALIZE(ierr) END PROGRAM main 38
proces slave kod procesu slave pokazano na kolejnych slajdach on jest bardzo podobny do czci slave w wersji dla MPI-1 now cech tutaj jest to, e po MPI_Init, procesy slave mog si porozumiewa ze sob, za pomoc ich MPI_COMM_WORLD, który zawiera wszystkie procesy rozmnoone tym samym MPI_Comm_spawn_call, ale nie z procesem master w tym przykładzie, procesy slave nie komunikuj si ze sob, komunikuj si jedynie z procesem master 39
proces slave aby uzyska komunikator zawierajcy proces master, procesy slave wykonuj: call MPI_COMM_GET_PARENT(parentcomm, ierr) to zwraca wparentcomm interkomunikator stworzony kolektywnym wywołaniem MPI_Comm_spawn w procesie master i MPI_Init w procesach slave lokalna grupa tego komunikatora (z punktu widzenia procesów slave), jest taka sama jak ich grupa MPI_COMM_WORLD 40
proces slave grupa zdalna jest zbiorem procesów, które kolektywnie wywołały MPI_Comm_spawn, która w tym przypadku zawiera jedynie proces master procesy slave wskazuj proces master jako numer 0 w parentcomm, podczas wymiany wierszy i iloczynów skalarnych kiedy procesy otrzymaj komunikat wszystko zrobione (tag=0), wtedy wywołuj MPI_Finalize i wychodz 41
mnoenie macierzy slave! Program slave dla mnoenia macierzy PROGRAM main use mpi integer MAX_COLS parameter (MAX_COLS = 1000) double precision b(max_cols) double precision buffer(max_cols), ans integer i, ierr, status(mpi_status_size) integer row, cols, rows, rank integer parentcom 42
mnoenie macierzy slave call MPI_INIT(ierr) call MPI_COMM_GET_PARENT(parentcomm, ierr)! proces master ma teraz numer 0 w zdalnej grupie! interkomunikatora rodzica.! procesy slave odbieraj b, nastpnie obliczaj! iloczyn a do odbioru komunikatu done rows = 100 cols = 100 call MPI_BCAST(b, cols, MPI_DOUBLE_PRECISION,0, & parentcomm, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) 43
mnoenie macierzy slave if (rank.ge. rows) go to 200! opu, jeeli jest wicej procesów ni prac 90 call MPI_RECV(buffer, cols, MPI_DOUBLE_PRECISION, 0, & MPI_ANY_TAG, parentcomm, status, ierr) if (status)mpi_tag).eq. 0) then go to 200 else row = status(mpi_tag) ans = 0.0 do 100 i = 1,cols ans = ans+buffer(i)*b(i) 100 continue call MPI_SEND(ans, 1, MPI_DOUBLE_PRECISION, 0, row, & parentcomm, ierr) go to 90 endif 44
mnoenie macierzy slave endif 200 continue call MPI_COMM_FREE(parentcomm, ierr) call MPI_FINALIZE(ierr) END PROGRAM main 45
znalezienie liczby dostpnych procesów MPI_UNIVERSE_SIZE daje aplikacji MPI informacje, ile procesów mona uruchomi MPI_UNIVERSE_SIZE jest atrybutem MPI_COMM_WORLD aplikacja wykorzystuje t informacj, ile dodatkowych procesów mona rozmnoy 46
znalezienie liczby dostpnych procesów modyfikacja czci master programu mnoenia macierzy w celu zastosowania MPI_UNIVERSE_SIZE do specyfikacji liczby dostpnych procesów wywołujemy MPI_Comm_get_attr, aby zobaczy, czy atrybut MPI_UNIVERSE_SIZE został ustawiony, jeeli tak, rozmnaamy o jeden proces slave mniej, ni jest ustawione (master te si liczy) 47
znalezienie liczby dostpnych procesów jeeli ten atrybut nie jest ustawiony (universe_size_flag = 0), stosujemy podejcie konserwatywne: tworzymy obiekt MPI_Info, stosujemy predefiniowany klucz soft i podajemy zakres procesów jak w argumencie soft w wywołaniu mpiexec MPI_Comm_spawn zwraca interkomunikator slavecomm, w którym zdalna grupa to rozmnoone procesy slave, rozmiar tej grupy okrela MPI_Comm_remote_size 48
modyfikacja programu master integer softinfo integer (kind=mpi_address_kind) universe_size logical universe_size_flag integer numslaves, i, errcodes(10) call MPI_COMM_GET_ATTR(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, & universe_size, universe_size_flag, ierr) if (universe_size_flag) then else call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL, universe_size-1, & MPI_INFO_NULL, 0, MPI_COMM_WORLD, & slavecomm, errcodes, ierr) call MPI_INFO_CREATE(softinfo, ierr) call MPI_INFO_SET(softinfo, soft, 1:10, ierr) 49
modyfikacja programu master call MPI_COMM_SPAWN( slave, MPI_ARGV_NULL,10, & softinfo, 0, MPI_COMM_WORLD, & slavecomm, errcodes, ierr) call MPI_INFO_FREE(softinfo, ierr) endif call MPI_COMM_REMOTE_SIZE(slavecomm, numslaves, ierr) do i=1, 10 if (errcodes(i).ne. MPI_SUCCESS) then print *, slave, i, did not start endif enddo print *, number of slaves =, numslaves 50
kod dostpu do wartoci MPI_UNIVERSE_SIZE z C int *universe_size_ptr, universe_size_flag;... MPI_Comm_get_attr( MPI_COMM_WORLD,MPI_UNIVERSE_SIZE, &universe_size_ptr,&universe_size_flag ); if (universe_sixe_flag) { printf( Number of processes available is %d\n, *universe_size_ptr ); } 51
przekazywanie argumentów do procesów rozmnaanych w dotychczasowych przykładach stosowalimympi_argv_null aby wskaza, e procesy rozmnaane s wywołane bez adnych argumentów w linii polece 52
przekazywanie argumentów do procesów rozmnaanych czasem przekazywanie parametrów jest uyteczne na przykład w programie kopiowania równoległego zamiast MPI_Bcast do rozsyłania nazwy pliku wyjciowego do procesów slave, mona uruchomi procesy z argumentem zawierajcym nazw pliku wyjciowego 53
przekazywanie argumentów do procesów rozmnaanych w przypadku gdy chcemy przekaza oddzielne argumenty w linii polece, stosujemy inn funkcj: MPI_Comm_spawn_multiple na przykład dla uruchomienia procesów stosujcych róne pliki wykonywalne 54
przekazywanie argumentów do procesów rozmnaanych char *slave... slave_argv[0] = argv[3] slave_argv[1] = NULL; MPI_Comm_spawn( pcp_slave, slave_argv, num_hosts,hostinfo, 0, MPI_COMM_SELF, &pcpslaves, MPI_ERRCODES_IGNORE ); 55
łczenie procesów MPI pewne aplikacje w sposób naturalny s stworzone z wielu oddzielnych programów jednym z przykładów jest symulacja klimatu stworzona z dwóch programów: symulacji oceanu i symulacji atmosfery innym przykładem jest aplikacja, łczca program wizualizacji z programem symulacji rozpatrzymy teraz ten przykład 56
łczenie procesów MPI jedn z zalet tego podejcia jest to, e wybór programu wizualizacji moe by dokonany w czasie wykonywania programu jest to odmienne od rozmnaania programu wizualizacji przez program symulacji to równie działa, gdy złoonorodowiska uruchomieniowego utrudnia start programu wizualizacji poleceniem mpiexec albo wywołaniem MPI_Comm_spawn 57
łczenie procesów MPI wiele dyskusji dotyczcych standardu MPI na temat łczenia procesów MPI mówi o modelu klient serwer my preferujemy spojrzenie na model MPI jak na model peer-to-peer (równorzdny, kady z kadym), gdzie jeden proces akceptuje połczenia, a drugi proces da połczenia 58
wizualizacja oblicze w programie MPI uruchamiajc symulacj, warto wizualizowa postpy symulacji, za pomoc grafiki trójwymiarowej, do narysowania biecego stanu rozwizania na siatce stosowanej do aproksymacji problemu jako przykład połczenia dwóch programów MPI, rozszerzamy solver Poissona, o połczenie z programem wizualizacji 59
wizualizacja oblicze w programie MPI modyfikacja programu Poissona polega na: program tworzy port i akceptuje połczenie na tym porcie. Port jest nazw, któr inny program moe uy do połczenia si z programem, który ten port utworzył wynikiem tego jest interkomunikator łczcy te dwa programy w kadej iteracji, solver Poissona nadaje biece rozwizanie do programu wizualizacji, stosujc operacje komunikacyjne w interkomunikatorze 60
wizualizacja oblicze w programie MPI pierwsza wersja zakłada, e program wizualizacji jest pojedynczym procesem jest on faktycznie do prosty w kadej iteracji, program odbiera numer iteracji, za pomoc dwupunktowej operacji interkomunikatora, i sam siatk, za pomoc MPI_Gatherv w operacji kolektywnej interkomunikatora 61
wizualizacja oblicze w programie MPI kod do inicjacji argumentów potrzebnych przez MPI_Gatherv stosuje MPI_Gather do odbioru danych, które kady proces w serwerze nadaje do tego programu rysowanie jest realizowane przez program DrawMesh funkcja MPI_Comm_connect ustala połczenie z innymi programami 62
wizualizacja oblicze w programie MPI poniewa decydujemy, aby program wizualizacji był dołczony do programu obliczeniowego, to program wizualizacji staje si klientem programu obliczeniowego argumentami wejciowymi wywołania funkcji MPI_Comm_connect s: nazwa portu, warto info, numer procesu wiodcego albo procesu root, oraz intrakomunikator 63
wizualizacja oblicze w programie MPI program wizualizacji aktualizuje dane przy kadej iteracji i rysuje z nich wykresy rozszerzeniem tego programu mogło by by uruchomienie tego programu w oddzielnym wtku, co pozwoliło by obraca i skalowa wykresy i współdziała z danymi 64
program wizualizacji #include mpi.h #define MAX_PROCS 128 #define MAX_MESH 512*512 int main( int argc, char *argv[] ) { MPI_Comm server; int it, i, nprocs,rcounts[max_procs], rdispls[max_procs]; double mesh[max_mesh]; char port_name[mpi_max_port_name]; MPI_Init( 0, 0 ); 65
program wizualizacji gets( port_name ); /* zakładamy tylko jeden proces w MPI_COMM_WORLD */ MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server ); MPI_Comm_remote_size( server, &nprocs ); /* pobierz liczb wartoci danych z kadego procesu */ MPI_Gather( MPI_BOTTOM, 0, MPI_DATATYPE_NULL, rcounts, 1, MPI_INT, MPI_ROOT, server ); /* oblicz przesunicie siatki */ rdispls[0] = 0; for (i=0; i<nprocs-1; i++) rdispls[i+1] = rdispls[i] + rcounts[i]; 66
program wizualizacji } while (1) { MPI_Recv( &it, 1, MPI_INT, 0, 0, server, MPI_STATUS_IGNORE ); if (it < 0) break; MPI_Gatherv( MPI_BOTTOM, 0, MPI_DATATYPE_NULL, mesh, rcounts, rdispls, MPI_DOUBLE, MPI_ROOT, server ); DrawMesh( mesh ); } MPI_Comm_disconnect( &server ); MPI_Finalize(); return 0; 67
akceptacja połcze z innych programów musimy zmodyfikowa program obliczajcy aproksymacje problemu Poissona, aby akceptował połczenie z programu wizualizacji i nadawał do niego dane do wizualizacji (program obliczajcy aproksymacje jest w Fortranie, program wizualizacji jest w C) oryginalny program jest niezmieniony zmiany s dodatkiem do tego programu 68
akceptacja połcze z innych programów zmiany obejmuj: stworzenie portu do którego łczy si program klienta, w tym celu wywołujemy MPI_OPEN_PORT, który podaje numer portu (ten port jest czytany przez instrukcjgets w programie wizualizacji) kiedy port jest otwarty, program pozwala dołczy si do niego innemu programowi MPI przez wywołanie MPI_COMM_ACCEPT 69
akceptacja połcze z innych programów rodkowa cz kodu nadaje dane do procesu klienta, rozpoczynajc od informacji o dekompozycji danych w procesie obliczeniowym, kontynuujc z licznikiem iteracji i biecymi wynikami w ptli iteracji te operacje komunikacji odpowiadaj wywołaniom komunikacji w programie wizualizacji (kliencie) 70
akceptacja połcze z innych programów ostatnia cz programu zamyka port i odłcza si od klienta wywołujc kolejno: MPI_CLOSE_PORT i MPI_COMM_DISCONNECT ostatnie wywołanie oznacza, e zakoczyła si cała komunikacja na komunikatorze po zamkniciu portu, nazwa portu zwracana przez MPI_OPEN_PORT jest niewana 71
modyfikacja przykładu Poisson a modyfikacja przykładu Poisson a pozwalajca akceptowa połczenia od programu wizualizacji i nadawa dane do niego 72
modyfikacja przykładu Poisson a character*(mpi_max_port_name) port_name integer client... if (myid. eq. 0) then call MPI_OPEN_PORT( MPI_INFO_NULL, port_name, ierr) print *, port_name endif call MPI_COMM_ACCEPT( port_name, MPI_INFO_NULL, 0, & MPI_COMM_WORLD, client, ierr );! nadaj informacj potrzebn do nadania siatki call MPI_GATHER( mesh_size, 1, MPI_INTEGER, & MPI_BOTTOM, 0, MPI_DATATYPE_NULL, & 0, client, ierr ) 73
... modyfikacja przykładu Poisson a! Dla kadej iteracji, nadaj lokaln cz siatki if (myid.eq. 0) then call MPI_SEND( it, 1, MPI_INTEGER, 0, 0, client, ierr ) endif call MPI_GATHERV( mesh, mesh_size, MPI_DOUBLE_PRECISION, & MPI_BOTTOM, 0, 0, & MPI_DATATYPE_NULL< 0, client, ierr )... 74
modyfikacja przykładu Poisson a! Odłcz od klienta przed wyjciem if (myid.eq. 0) then call MPI_CLOSE_PORT( port_name, ierr) endif call MPI_COMM_DISCONNECT( client, ierr) call MPI_FINALIZE( ierr ) 75
porównanie z gniazdami procedury MPI łczenia dwóch grup procesów odpowiadaj prostemu modelowi znanemu z gniazd Unixa podobiestwa wystpuj midzy: MPI_OPEN_PORT procedury socket, bind i listen w gniazdach MPI_COMM_ACCEPT procedura accept MPI_COMM_CONNECT procedury socket i connect 76
porównanie z gniazdami rónice wystpuj midzy: interfejs gniazda ustala połczenie midzy dwoma procesami, a interfejs MPI łczy dwie grupy procesów Forum MPI preferuje si uywanie wtków oraz blokujcych wersji gniazd inne cechy interfejsu gniazda, obejmujce n.p. sterowanie czasami oczekiwania, mona osign w MPI za pomoc pewnych zabiegów implementacyjnych 77
przesyłanie danych midzy grupami procesów jeeli dane s wielkie, program wizualizacji powinien by równoległy, np. wersja MPI programu POV-RAY nadajemy wtedy struktur danych, która jest rozdzielana w jeden sposób na jednej grupie procesów, a w inny na drugiej grupie procesów rozwamy dwie odmienne dekompozycje, gdzie procesy z lewej nadaj do procesów po prawej 78
przesyłanie danych midzy grupami procesów transfer danych midzy programem symulacji (4 procesy) a programem wizualizacji (3 procesy) P3 P2 P1 P0 ---------------- ---------------- ---------------- ---------------- ---------------- P2 P1 P0 siatka w sekcji obliczeniowej siatka w sekcji wizualizacyjnej 79
przesyłanie danych midzy grupami procesów linie cigłe wskazuj dekompozycj siatki midzy procesy, linie przerywane wskazuj podział siatki za pomoc drugiej grupy procesów, strzałki wskazuj transfery P3 P2 P1 P0 ---------------- ---------------- ---------------- ---------------- ---------------- P2 P1 P0 siatka w sekcji obliczeniowej siatka w sekcji wizualizacyjnej 80
przesyłanie danych midzy grupami procesów procedura MPI_Alltoallv jest elastyczniejsz wersj procedury MPI_Alltoall kolektywna procedura w interkomunikatorze kady proces w jednej grupie nadaje róne dane do kadego innego procesu w innej grupie u nas tak nie jest, nie kady proces nadaje do kadego, tam gdzie nie ma danych do nadania ustawiamy sendcounts = 0 81
przesyłanie danych midzy grupami procesów kolejny program oblicza argumenty sendcounts i sdispls dla MPI_Alltoallv, gdzie proces wywołujcy ma wiersze s do e w siatce, a dekompozycja na serwerze wizualizacji jest podany przez tablicm, gdzie m(i) jest liczb wierszy w procesie i MPI_Alltoallv jest uyteczne, gdy grafika jest na stacjach graficznych, a obliczenia na zdalnym superkomputerze 82
r_s = 1 displ = 0 obliczenie argumentów MPI_Alltoallv do i=0, viz_numporcs-1 if (s.ge. r_s + m(i)) then sendcounts(i) = 0 sdispls(i) = 0 elseif (e.lt. r_s) then sendcounts(i) = 0 sdispls(i) = 0 83
enddo else endif obliczenie argumentów MPI_Alltoallv sendcounts(i) = min( e s + 1, r_s + m(i) s) * nx sdispls(i) displ r_s = r_s + m(i) = displ = displ + sencounts(i) 84
publikacja nazwy portu we wczeniejszym przykładzie, zastosowano instrukcjprint aby umieci nazw portu na standardowym wyjciu, a instrukcj gets aby odczyta t nazw na standardowym wejciu jest to całkowicie ogólne, ale troch niezgrabne print *, port_name publikuje nazw portu, podobnie gets( port_name) powoduje, e klient szuka numeru portu 85
publikacja nazwy portu alternatyw do print i gets w MPI-2 jest usługa nazw (name service) program wybiera prywatn nazw zwan nazw usługi nazwa portu jest zwizana z nazw usługi za pomoc procedury MPI_Publish-name t asocjacj usuwa si poprzez MPI_Unpublish_name 86
publikacja nazwy portu proces poszukujcy danego portu przekazuje nazw usługi do MPI_Lookup_name pokaemy teraz zmiany w kodzie programu wizualizacji i symulacji aby zezwoli im na tak publikacj nazw publikacja ma pewne ograniczenia: nazw usługi wybiera programista, std dwóch moe wybra t sam nazw usługi w dwóch rónych aplikacjach, rozwizaniem moe by zcentralizowana rejestracja nazw albo dodanie do nazwy usługi unikalnego identyfikatora uytkownika 87
publikacja nazwy portu w programie wizualizacji: MPI_Lookup_name( Poisson, MPI_INFO_NULL, port_name ); MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server); 88
publikacja nazwy portu w programie symulacji (przykład Poissona): character*(mpi_max_port_name) port_name integer client... if (myid.eq. 0) then endif call MPI_OPEN_PORT( MPI_INFO_NULL, port_name, ierr ) call MPI_PUBLISH_NAME( Poisson, MPI_INFO_NULL, & port_name, ierr ) call MPI_COMM_ACCEPT( port_name, MPI_INFO_NULL, 0, & MPI_COMM_WORLD, client, ierr ); 89
publikacja nazwy portu w programie symulacji (przykład Poissona):... if (myid.eq. 0) then call MPI_UNPUBLISH_NAME( Poisson, MPI_INFO_NULL, & port_name, ierr ) call MPI_CLOSE_PORT( port_name, ierr ) 90
cele dynamicznego zarzdzania procesami przenono (aplikacje uruchamiane dla rónych systemów szeregowanie zada i zarzdzanie procesami, jeden proces na wzeł, zbiór procesów niezmienny, zmiana wymaga operacji kolektywnych) determinizm (zbiór procesów niezmienny) skalowalno i efektywno (operacje kolektywne) 91
czego MPI nie standaryzuje? pewne cechy zalene od implementacji MPI nie standaryzuje si: zarzdcy zadaniami interfejsu uruchomienia procesu 92
podsumowanie omówilimy tutaj podstawowe kwestie dotyczce dynamicznego zarzdzania procesami oczywicie temat stosowania MPI-2 nie został w pełni wyczerpany oddzielnego potraktowania wymaga stosowanie MPI z wtkami 93