Biblioteki graficzne MPI - MPE Michał Sajkowski Mirosław Kupczyk
literatura [Chan1998] A. Chan, W. Gropp, E. Lusk, User s Guide formpe: Extensions to MPI Programs, ANL 1998. Web pages for MPI and MPE: http://wwwunix.mcs.anl.gov/mpi/www/ [Chan2005] A. Chan, D. Ashton, R. Lusk, W. Gropp, Jumpshot-4 Users Guide, ANL, May 2005 2
literatura [Gropp1999] W. Gropp, E. Lusk, A. Skjellum, Using MPI. Portable Parallel Programming with the Message Passing Interface, 2nd edition, The MIT Press 1999 [PerfVis] Performance Visualization for Parallel Programs, http://wwwunix.mcs.anl.gov/perfvis/ 3
literatura [Meglicki2004] Z. Meglicki, High Performance Data Management and Processing, I590, Section 7462, Indiana University, April 2004, 407 pages. 4
co to jest MPE? MPE (Multi-Processing Environment) jest to pakiet zapewniajcy programicie kompletny zestaw narzdzi analizy wydajnoci programów MPI pakiet ten zawiera: biblioteki profilujce programy uytkowe narzdzia wizualizacji 5
biblioteki profilujce zawieraj programy do tworzenia plików dziennika (logi) pliki te mona tworzy na trzy sposoby: rcznie za pomoc wywoła MPE w programie MPI automatycznie przez linkowanie bibliotek MPE łcznie oboma sposobami 6
biblioteki profilujce MPE oferuje obecnie trzy biblioteki profilujce: bibliotekladów (Tracing Library) bibliotek animacji (Animation Library) bibliotek dzienników (Logging Library) 7
biblioteka ladów ledzi wszystkie wywołania MPI kade wywołanie MPI jest poprzedzone lini zawierajc numer procesu w MPI_COMM_WORLD procesu wywołujcego, po której jest linia wskazujca e wywołanie si zakoczyło wiele programów nadawania i obioru wskazuje warto licznika, etykiety i partnera (dest/source) wyjcie jest kierowane na wyjcie standardowe 8
biblioteka animacji prosty program animacji w czasie rzeczywistym wymaga X-window 9
biblioteka dzienników najczciej wykorzystywana biblioteka w MPE tworzy podstawy dla generowania dzienników z programów MPI formaty plików dziennika: CLOG, ALOG i SLOG 10
formaty plików dziennika CLOG format domylny, zbiór zdarze etykietowanych czasem ALOG dla kompatybilnoci wstecznej SLOG Scalable LOG, najmocniejszy, przekształcany z CLOG (preferowane), albo generowany przy wykonywaniu programu MPI (zmienna MPE_LOG_FORMAT ustawiona na SLOG) 11
programy uytkowe konwertery formatu dziennika (clog2slog) programy wydruku dziennika (slog_print) 12
narzdzia wizualizacji programy do wywietlania dziennika (upshot dla ALOG, jumpshot-2 dla CLOG i jumpshot-3 dla SLOG) 13
mechanizmy tworzenia dziennika dziennik zdarze: kady element dziennika ma tylko etykiet czasow dziennik stanów: kady element dziennika zawiera etykiet czasow zdarzenia pocztkowego i zdarzenia kocowego dziennik graficzny: element dziennika to w pełni graficzny obiekt 14
formaty plików dziennika dziennik zdarze: ALOG, BLOG, CLOG dziennik stanów: SLOG-1 dziennik graficzny: SLOG-2 15
ALOG przykład: plik ASCII zdarze i stanów [Meglicki2004]: -7 0 0 0 0 42890-8 0 0 1 0 0-11 0 0 0 0 0-13 0 13 14 0 0 cyan:boxes BCAST -13 0 25 26 0 0 purple:2x2 REDUCE 16
SLOG-2 przykład [Meglicki2004]: Number of Drawables = 16 Number of Unmatched Events = 0 Total ByteSize of the logfile = 3688 timeelapsed between 1 & 2 = 873 msec timeelapsed between 2 & 3 = 50 msec 17
cele biblioteki MPE analiza i wizualizacja programu MPI wizualizacja danych obsługiwanych przez program MPI 18
wyposaenie programu MPI w mechanizmy MPE omówimy teraz, korzystajc z analizy przedstawionej w [Meglicki2004], sposób wyposaenia programu MPI w mechanizmy MPE 19
wyposaenie programu MPI w mechanizmy MPE jak wyposay program jak czyta dziennik wykorzystywane narzdzia wizualizacji przykład zaczerpnity z [Meglicki2004] 20
wyposaenie programu MPI w mechanizmy MPE MPE zapewnia zaawansowane narzdzia do zapisu zdarze i stanów programu do dziennika dzienniki s tworzone na bieco i zapisywane w pamici, aby zminimalizowa wpływ zapisu na działanie programu po zakoczeniu programu zapisywany jest plik dziennika 21
wyposaenie programu MPI w mechanizmy MPE zapisowi do dziennika towarzysz dokładne etykiety czasowe pozwala to okreli i rozwiza problemy z synchronizacj, komunikacj oraz zapewni optymalizacj tych działa moemy w ten sposób wpływa na wykonanie programu 22
wyposaenie programu MPI w mechanizmy MPE tworzenie dziennika z etykietami czasowymi, zwane tworzeniem dziennika MPE, jest realizowane domylnie obowizuje zasada, e wszystko, co zdarzy si w programie, jest zapisywane w dzienniku dziennik mona potem dostosowa do potrzeb 23
wyposaenie programu MPI w mechanizmy MPE aby uruchomi tworzenie dziennika MPE, przy kompilacji programu naley dolinkowa bibliotek lmpe: jeeli programem kompilowanym jest program MPI wyliczania liczby π, o nazwie cpi, mamy: mpicc c cpi cpi.c llmpe -lmpe 24
wyposaenie programu MPI w mechanizmy MPE wtedy po wykonywaniu programu cpi: mpiexec n 8 cpi w treci wyniku działania programu pojawi si dwie linie: Writing logfile. Finished writing logfile. a w katalogu plik dziennika cpi.clog 25
wyposaenie programu MPI w mechanizmy MPE mona przekształci plik dziennika clog w plik slog2, poleceniem: clogt0slog2 cpi.clog i otrzyma bardziej czytelny plik cpi.slog2 a nastpnie uruchomi program jumpshot na pliku slog2 26
wyposaenie programu MPI w mechanizmy MPE jumpshot jest stosunkowo duym programem w jzyku Java, który czyta plik slog2 i wywietla zdarzenia i stany programu w postaci wielu długich, poziomych termometrów, gdzie kady termometr odpowiada jednemu procesowi 27
wyposaenie programu MPI w mechanizmy MPE przesyłanie komunikatów jest oznaczane za pomoc strzałek, łczcych róne termometry w ten sposób łatwo zobaczy, kiedy komunikat został nadany, a kiedy odebrany rónym stanom procesu odpowiadaj róne kolory termometru 28
wyposaenie programu MPI w mechanizmy MPE przykład z jumpshot-4 [Chan2005]: 29
wyposaenie programu MPI w mechanizmy MPE obliczanie moe by oznaczone kolorem czerwonym, czekanie na dane kolorem czarnym, itp. okno wywietlajce termometry nazywa si Timeline Window duy program moe dawa nieczytelny rysunek, który mona oglda za pomoc opcji szkła powikszajcego 30
wyposaenie programu MPI w mechanizmy MPE w celu dopasowania zapisu dziennika, naley program MPI jawnie wyposay w odpowiednie mechanizmy zacytujemy przykład wyposaenia programu MPI w mechanizmy MPE, podany w [Meglicki2004], analizujcy znany program cpi.c, znajdujcy si w dokumentacji MPICH2 31
wyposaenie programu MPI w mechanizmy MPE #include <mpi.h> #include <mpe.h> #include <math.h> #include <stdio.h> double f( double ); double f(double a) { return (4.0 / (1.0 + a*a)); } 32
wyposaenie programu MPI w mechanizmy MPE int main( int argc, char *argv[]) { int n, myid, numprocs, i, j; double PI25DT = 3.141592653589793238462643 double mypi, pi, h, sum, x; double startwtime = 0.0, endwtime; int namelen; int event1a, event 1b, event2a, event2b, event3a, event3b, event4a, event4b; char processor_name[mpi_max_processor_name]; MPI_Init(&argc, &argv); 33
wyposaenie programu MPI w mechanizmy MPE MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_Size(MPI_COMM_WORLD, &myid); MPI_Get_processor_name(processor_name, &namelen); printf(stderr,"process %d running on%s\n", myid, processor_name); MPE_Init_log(); 34
wyposaenie programu MPI w mechanizmy MPE /* we event ID z MPE, uytkownik nie powinien przydziela event ID */ event1a = MPE_Log_get_event_number(); event1b = MPE_Log_get_event_number(); event2a = MPE_Log_get_event_number(); event2b = MPE_Log_get_event_number(); event3a = MPE_Log_get_event_number(); event3b = MPE_Log_get_event_number(); event4a = MPE_Log_get_event_number(); event4b = MPE_Log_get_event_number(); 35
wyposaenie programu MPI w mechanizmy MPE if (myid == 0) { MPE_Describe_state(event1a, event1b, "Broadcast", "red"); MPE_Describe_state(event2a, event2b, "Compute", "blue"); MPE_Describe_state(event3a, event3b, "Reduce", "green"); MPE_Describe_state(event4a, event4b, "Sync", "orange"); } if (myid == 0) { n = 1000000; startwtime = MPI_Wtime(); } 36
wyposaenie programu MPI w mechanizmy MPE MPI_Barrier(MPI_COMM_WORLD); MPE_Start_log(); for (j = 0; j < 5; j++) { MPE_Log_event(event1a, 0, "start broadcast"); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); MPE_Log_event(event1b, 0, "end broadcast"); 37
wyposaenie programu MPI w mechanizmy MPE MPE_Log_event(event4a, 0, "Start Sync"); MPI_Barrier(MPI_COMM_WORLD); MPE_Log_event(event4b, 0, "End Sync"); MPE_Log_event(event2a, 0, "start compute"); h = 1.0 / (double) n; sum = 0.0; for (i = myid + 1; i <=n; i += numprocs) { x = h * ((double)i 0.5); sum += f(x); } 38
wyposaenie programu MPI w mechanizmy MPE mypi = h * sum; MPE_Log_event(event2b, 0, "end compute"); MPE_Log_event(event3a, 0, "start reduce"); MPI_Reduce(&mypi, &pi,1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); MPE_Log_event(event3b, 0, "end reduce"); } MPE_Finish_log("cpilog "); if (myid == 0) { 39
wyposaenie programu MPI w mechanizmy MPE if (myid == 0) { endwtime = MPI_Wtime(); printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi PI25DT)); printf("wall clock time = %f\n", endwtime-startwtime); } } MPI_Finalize(); return(0); 40
wyposaenie programu MPI w mechanizmy MPE program ten mona zlinkowa z bibliotek lmpe nastpujco: mpicc o cpilog cpilog.c lmpe po uruchomieniu, generuje si plik cpilog.clog, który nastpnie jest przetwarzany za pomoc clogt0slog2 i ogldany programem jumpshot 41
wyposaenie programu MPI w mechanizmy MPE przyjrzyjmy si bliej programowi wyposaonemu w mechanizmy MPE wywołanie funkcji MPE_Init_log() inicjuje podsystem tworzenia dziennika ta funkcja jest wywołana jawnie, kiedy program jest zlinkowany z bibliotek -lmpe 42
wyposaenie programu MPI w mechanizmy MPE zalet jawnego zapisu dziennika jest moliwo wyboru, co si zapisuje przy linkowaniu programu z bibliotekami llmpe lmpe, funkcja ta jest wywołana przez bibliotek llmpe zaraz na pocztku programu, w sposób niejawny wtedy wszystko jest zapisywane w dzienniku 43
wyposaenie programu MPI w mechanizmy MPE po inicjacji zapisu dziennika, definiuje si zdarzenia, przydzielajc dynamicznie generowane liczby całkowite zdarzeniom: event1a = MPE_Log_get_event_number(); event1b = MPE_Log_get_event_number(); event2a = MPE_Log_get_event_number(); event2b = MPE_Log_get_event_number(); event3a = MPE_Log_get_event_number(); event3b = MPE_Log_get_event_number(); event4a = MPE_Log_get_event_number(); event4b = MPE_Log_get_event_number(); 44
wyposaenie programu MPI w mechanizmy MPE nastpnie definiuje si stany wywołujc funkcje MPE_Describe_state: if (myid == 0) { MPE_Describe_state(event1a, event1b, "Broadcast", "red"); MPE_Describe_state(event2a, event2b, "Compute", "blue"); MPE_Describe_state(event3a, event3b, "Reduce", "green"); MPE_Describe_state(event4a, event4b, "Sync", "orange"); } 45
wyposaenie programu MPI w mechanizmy MPE definicje nie podaj jeszcze czym s te zdarzenia, ale teraz programista musi podj decyzj zdarzenia event1a i event1b to pocztek i koniec rozgłaszania (broadcast) kiedy dziennik jest analizowany przez program jumpshot, czas trwania rozgłaszania jest oznaczony czerwonym paskiem 46
wyposaenie programu MPI w mechanizmy MPE podobnie, obliczenie moe by oznaczone na niebiesko, MPI_Reduce na zielono, a czas trwania MPI_Barrier na pomaraczowo std działania oznaczone na niebiesko maj tu znaczenie pozytywne, a innym kolorem negatywne 47
wyposaenie programu MPI w mechanizmy MPE definicja stanu jest okrelana dla jednego procesu, pozostałe j akceptuj sam zapis dziennika rozpoczyna si wywołaniem funkcji MPE_Start_log() wtedy podajemy, co oznacza dane zdarzenie, poczynajc od zdarzenia event1a do zdarzenia event4b 48
wyposaenie programu MPI w mechanizmy MPE funkcja MPE_Log_event zapisuje zdarzenie event1a, oznaczajce start broadcast, tu przed wywołaniem MPI_Bcast : MPE_Log_event(event1a, 0, "start broadcast"); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); MPE_Log_event(event1b, 0, "end broadcast"); i zdarzenie event1b, oznaczajce end broadcast tu po zakoczeniu MPI_Bcast jumpshot pokazuje ten czas na czerwono 49
wyposaenie programu MPI w mechanizmy MPE podobnie moemy zakreli wywołanie funkcji MPI_Barrier zdarzeniami event4a i event4b : MPE_Log_event(event4a, 0, "Start Sync"); MPI_Barrier(MPI_COMM_WORLD); MPE_Log_event(event4b, 0, "End Sync"); 50
wyposaenie programu MPI w mechanizmy MPE równie moemy oznaczy całe obliczanie zdarzeniami event2a i event2b : MPE_Log_event(event2a, 0, "start compute"); h = 1.0 / (double) n; sum = 0.0; for (i = myid + 1; i <=n; i += numprocs) { x = h * ((double)i 0.5); sum += f(x); } mypi = h * sum; MPE_Log_event(event2b, 0, "end compute"); 51
wyposaenie programu MPI w mechanizmy MPE i na koniec zaznaczamy wywołanie MPI_Reduce zdarzeniami event3a i event3b : MPE_Log_event(event3a, 0, "start reduce"); MPI_Reduce(&mypi, &pi,1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); MPE_Log_event(event3b, 0, "end reduce"); 52
wyposaenie programu MPI w mechanizmy MPE wywołanie funkcji MPE_Finish_log("cpilog "); zamyka dziennik i zapisuje go do pliku cpilog.clog to wywołanie jest wydane jawnie, kiedy stosuje si linkowanie jedynie z bibliotek lmpe kiedy jest linkowanie z bibliotekami llmpe i lmpe, wtedy plik jest generowany automatycznie 53
wyposaenie programu MPI w mechanizmy MPE poniewa programista moe si pomyli, wtedy lepiej stosowa automatyczny zapis do dziennika 54
grafika MPE stworzono j dla równoległego wywietlania danych z wielu procesów w jednym oknie X zawiera programy rysujce i dwa programy odczytujce pozycj myszki oraz prostokt zakrelany myszk pokaemy przykład grafiki MPE z wykorzystaniem programu cxgraphics.c z ksiki [Meglitski2004] 55
grafika MPE oto kod programu cxgraphics.c : #include <stdio.h> #include <stdlib.h> #include "mpe.h" #include "mpe_graphics.h" int main( int argc, char** argv ) { MPE_XGraph graph; int ierr, mp_size, my_rank; MPE_Color my_color; char ckey; 56
grafika MPE MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &mp_size ); MPI_Comm_rank( MPI_COMM_WORLD, &my_rank ); ierr = MPE_Open_graphics( &graph, MPI_COMM_WORLD, NULL, if ( ierr!= MPE_SUCCESS ) { } -1, -1, 400, 400, 0 ); fprintf( stderr, "%d : MPE_Open_graphics() fails\n", my_rank ); ierr = MPI_Abort( MPI_COMM_WORLD, 1 ); 57
grafika MPE my_color = (MPE_Color) (my_rank + 1); if ( my_rank == 0 ) ierr = MPE_Draw_string( graph, 187, 205, MPE_BLUE, "Hello" ); ierr = MPE_Draw_circle( graph, 200, 200, 20+my_rank*5, my_color ); ierr = MPE_Update( graph ); if ( my_rank == 0 ) { fprintf( stdout, "Hit any key then return to continue " ); fscanf( stdin, "%s", &ckey ); fprintf( stdout, "\n" ); } 58
grafika MPE MPI_Barrier( MPI_COMM_WORLD ); ierr = MPE_Close_graphics( &graph ); MPI_Finalize(); } return 0; 59
grafika MPE program ten linkuje i kompiluje si poleceniem: mpicc -o cxgraphics cxgraphics.c -lmpe -L/usr/X11R6/lib -lx11 lm nastpnie mona go uruchomi poleceniem: mpiexec n 16 cxgraphics program ten rysuje proste figury geometryczne i wywietla napisy w kolorze 60
grafika MPE wyjanijmy wpierw procedury graficzne w programie: po inicjacji MPI: MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &mp_size ); MPI_Comm_rank( MPI_COMM_WORLD, &my_rank ); program otwiera okno X11: ierr = MPE_Open_graphics( &graph, MPI_COMM_WORLD, NULL, -1, -1, 400, 400, 0 ); 61
grafika MPE ierr = MPE_Open_graphics( &graph, MPI_COMM_WORLD, NULL, -1, -1, 400, 400, 0 ); &graph to wskanik do zmiennej MPE_Xgraph, po otwarciu okna, procedury rysujce odnosz si do rysunku graph komunikator nazwa ekranu, moe bynull rozmiar okna 400pixels x 400pixels 0, to tryb niekolektywny funkcji 62
grafika MPE poniewa jest to tryb niekolektywny, wiele procesów zwraca róne odpowiedzi testuje si jak inne błdy były obsługiwane fragmentem programu: if ( ierr!= MPE_SUCCESS ) { } fprintf( stderr, "%d : MPE_Open_graphics() fails\n", my_rank ); ierr = MPI_Abort( MPI_COMM_WORLD, 1 ); 63
grafika MPE if ( ierr!= MPE_SUCCESS ) { } fprintf( stderr, "%d : MPE_Open_graphics() fails\n", my_rank ); ierr = MPI_Abort( MPI_COMM_WORLD, 1 ); proces, któremu nie udało si uzyska dostpu do ekranu X11 i otworzy swojej czci okna X11, pisze komunikat o błdzie i rezygnuje, co moe zakoczy cały program MPI 64
grafika MPE zakładajc, e tak si nie stało, proces definiuje swój kolor: my_color = (MPE_Color) (my_rank + 1); a proces o numerze 0 wywietla słowo hello w oknie: if ( my_rank == 0 ) ierr = MPE_Draw_string( graph, 187, 205, MPE_BLUE, "Hello" ); 65
grafika MPE if ( my_rank == 0 ) ierr = MPE_Draw_string( graph, 187, 205, MPE_BLUE, "Hello" ); pierwszy argument funkcji MPE_Draw_string to graph zwracany przez MPE_Open_graphics drugi i trzeci to współrzdne pocztku łacucha w pikselach, wzgldem lewego górnego rogu okna, czwarty to kolor łacucha, ostatni to sam łacuch (tekst) 66
grafika MPE teraz kady proces rysuje koło własnego koloru, o rodku w punkcie (200,200): ierr = MPE_Draw_circle( graph, 200, 200, 20+my_rank*5, my_color ); argumenty funkcji to: graph, współrzdne rodka, promie koła w pikselach, kolor nastpnie wywoływana jest funkcja: ierr = MPE_Update( graph ); 67
grafika MPE nastpnie wywoływana jest funkcja: ierr = MPE_Update( graph ); zapewniajca, e wszystko co jest rysowane na obiekcie graph jest przekazane do okna X11 68
grafika MPE w tym momencie program czeka na uytkownika, a co napisze na klawiaturze w przeciwnym razie obraz zniknie prawie natychmiast: if ( my_rank == 0 ) { } fprintf( stdout, "Hit any key then return to continue " ); fscanf( stdin, "%s", &ckey ); fprintf( stdout, "\n" ); MPI_Barrier( MPI_COMM_WORLD ); 69
grafika MPE zauwamy, e to process 0 jest odpowiedzialny za konsol inne procesy czekaj na barier bariera musi by, gdy mamy potem: ierr = MPE_Close_graphics( &graph ); 70
grafika MPE gdyby tak nie było, inne procesy mogłyby pobra swoje czci rysunku, ale poniewa jest bariera, mog to zrobi dopiero po napisaniu czego przez uytkownika na klawiaturze program koczy si standardowo: MPI_Finalize(); } return 0; 71
grafika MPE Wszystkie procesy współdziel ten sam obiekt graph. Kady proces ma dostp do dowolnego piksela to zaley od programisty, czy one sobie nie przeszkadzaj 72
Jumpshot-4 [Chan2005] 73
Jumpshot-4 [Chan2005] 74