Optymalizacja komunikacji w systemach rozproszonych i równoległych Szkolenie PCSS, 16.12.2001
literatura W. Gropp, E. Lusk, An Introduction to MPI, ANL P.S. Pacheco, A User s Guide to MPI, 1998 Ian Foster, Designing and Building Parallel Programs, Addison-Wesley 1995, http://www-unix.mcs.anl.gov/dbpp/ 2
literatura J. Dongarra, I. Foster, G. Fox, W. Gropp, K. Kennedy, L. Torczon, A. White, The Sourcebook of Parallel Computing, Morgan Kaufmann 2002 J.J. Dongarra, S.W. Otto, M. Snir, D. Walker, An Introduction to the MPI Standard, ORNL 1995 3
literatura W. Gropp, E. Lusk, T. Sterling, Beowulf Cluster Computing, Second Edition, The MIT Press, 2003 4
literatura W. Gropp, E. Lusk, R. Thakur, Advanced Features of the Message Passing Interface, The MIT Press 1999 W. Gropp, E. Lusk, A. Skjellum, Portable Parallel Programming with the Message Passing Interface, 2nd edition, The MIT Press 1999 5
literatura P.S. Pacheco, Parallel Programming with MPI, Morgan Kaufmann 1996 W. Gropp, E. Lusk, R. Thakur, Using MPI-2. Advanced Features of the Message-Passing Interface, The MIT Press, 1999 6
literatura Neil MacDonald, Elspeth Minty, Mario Antonioletti, Joel Malard, Tim Harding, Simon Brown, Writing Message-Passing Parallel Programs with MPI. Course Notes. Edinburgh Parallel Computing Centre, The University of Edinburgh, Epic Version. 1995 http://www.epcc.ed.ac.uk/epic/mpi/notes/mpicourse-epic.book_1.html 7
literatura S. Akhter, J. Roberts, Multi-Core Programming. Increasing Performance Through Software Multi-Threading, Intel Press, 2006 O. La adan, A. Barak, Inter Process Communication Optimization in a Scalable Computing Cluster, Hebrew University, Jerusalem 1998 8
literatura R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydam, J. McDonald, Parallel Programming in Open MP, Morgan Kaufmann, San Francisco, 2000. B. Chapman, G. Jost, R. van der Pas, Using OpenMP: Portable Shared Memory Parallel Programming, The MIT Press, 2007. http://openmp.org/ 9
optymalizacja komunikacji co to jest optymalizacja komunikacji? jest to minimalizacja liczby przesyłanych komunikatów, albo minimalizacja rozmiaru komunikatu, z jednoczesnym zachowaniem poprzedniej funkcjonalnoci 10
optymalizacja komunikacji jak to mona osign? zmiana przydziału zada do wzłów sieci w celu redukcji narzutu dot. komunikacji komunikacja kolektywna grupowanie danych w jeden komunikat minimalizacja synchronizacji i komunikacji midzy wtkami 11
zmiana przydziału zada [La adan1998] problem przydziału zada do wzłów (task clustering) w celu redukcji narzutu komunikacyjnego, przy utrzymaniu zrównowaenia systemu narzut wie si z przydziałem zada (procesów) do rónych wzłów gdyby te zadania wykonywa na jednym wle, narzut by si zmniejszył 12
zmiana przydziału zada [La adan1998] z drugiej strony obcia to zbytnio konkretny wzeł spowalniajc jego prac naley zachowa kompromis midzy tendencj zrównowaenia obcienia a tendencj do grupowania zada problem przydziału zada do wzłów jest NP-trudny 13
komunikacja kolektywna wykonywana jest przez wszystkie procesy biorce udział w obliczeniach s dwa rodzaje operacji kolektywnych: operacje przekazywania danych, do nowej aranacji danych midzy procesami, np. broadcast, scattering, gathering operacje oblicze kolektywnych (min, max, suma, OR, ) 14
komunikacja kolektywna załómy, e program działa na 8 procesorach wszystkie procesy rozpoczynaj wykonywanie programu prawie jednoczenie jednak po wykonaniu podstawowych zada (wywołampi_init, MPI_Comm_Size i MPI_Comm_rank), proces 0 zbiera dane wejciowe, a procesy od 1 do 7 s bezczynne, czekajc na dane od procesu 0 naley to zmieni, wprowadzajc komunikacj o strukturze drzewiastej 15
komunikacja kolektywna jak rozdziela dane? Jak dzieli zadania bardziej równomiernie midzy procesy? naturalnym rozwizaniem jest struktura drzewiasta procesów, z 0 jako korzeniem 16
struktura drzewiasta procesów 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 17
w 1 etapie, 0 nadaje dane do 4 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 18
w drugim etapie, 0 nadaje dane do 2, a 4 nadaje dane do 6 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 19
w 3 etapie, 0 nadaje do 1,2 nadaje do 3, 4 nadaje do 5, a 6 nadaje do 7 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 20
komunikacja o strukturze drzewiastej w ten sposób zredukowano pocztkowe rozdzielanie danych z 7 etapów do 3 etapów w ogólnoci, jeeli mamy p procesów, procedura ta pozwala rozdziela dane wejciowe w log 2 (p) etapach, zamiast w p -1 etapów dla duego p, s to due oszczdnoci 21
rozgłaszanie wzorzec komunikacji, angaujcy wszystkie procesy w komunikatorze, jest komunikacj kolektywn czyli komunikacja kolektywna zazwyczaj angauje wicej ni dwa procesy rozgłaszanie jest komunikacj kolektywn, w której jeden proces nadaje te same dane do kadego procesu 22
rozgłaszanie [Dongarra1995] 23
rozgłaszanie w MPI int MPI_Bcast(void* message, int count, MPI_Datatype datatype, int root, MPI_Comm comm) nadaje kopi danych w message z procesu root do kadego procesu w komunikatorze comm powinien by wywołany przez wszystkie procesy w komunikatorze z tymi samymi argumentami dla root i comm skutkiem tego, komunikat rozgłaszania nie moe by odbierany przez MPI_Recv 24
rozgłaszanie w MPI parametry count i datatype maj te same funkcje co w MPI_Send i MPI_Recv: okrelaj rozmiar komunikatu jednak inaczej ni w funkcjach od punktu do punktu, MPI wymaga, aby w komunikacji kolektywnej, count i datatype były takie same we wszystkich procesach w komunikatorze przyczyna jest taka, e w pewnych operacjach kolektywnych, jeden proces moe odbiera dane od wielu innych procesów, i aby program mógł okreli, ile danych odebrano, potrzebuje całej tablicy statusów zwrotnych 25
redukcja w fazie sumowania wyników proces 0 ma znowu mnóstwo pracy moemy t prac rozdzieli przez odwrócenie strzałek w drzewie, moemy podzieli zadanie obliczenia sumy midzy poszczególne procesy 26
redukcja 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 27
redukcja w pierwszym etapie proces 1 nadaje swój wynik oblicze do procesu 0, proces 3 nadaje swój wynik do procesu 2, proces 5 nadaje swój wynik do procesu 4, a proces 7 nadaje swój wynik do procesu 6 nastpnie proces 0 dodaje swój wynik do wyniku procesu 1, proces 2 dodaje swój wynik do wyniku procesu 3, itd. 28
redukcja 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 29
redukcja w drugim etapie proces 2 nadaje sum wyników do procesu 0, proces 6 nadaje sum wyników do procesu 4 proces 0 sumuje swój wynik z sum wyników od procesu 2 proces 4 sumuje swój wynik z sum wyników otrzyman od procesu 6 30
redukcja w trzecim etapie proces 4 nadaje swoj sum (wyniki od procesów 4, 5, 6 i 7) do procesu 0 proces 0 dodaje swoj sum (wyniki od procesów 0, 1, 2 i 3) do sumy otrzymanej od procesu 4 31
redukcja pojawia si pytanie, czy struktura drzewiasta optymalnie wykorzystuje topologi maszyny? to zaley od maszyny, najlepiej to sprawdzi, uruchamiajc MPI obliczenie sumy globalnej jest przykładem klasy komunikacji kolektywnej, zwanej operacj redukcji 32
operacja redukcji w tej operacji wszystkie procesy w komunikatorze wnosz dane, które s przekształcane za pomoc operacji binarnej (dodawanie, max, min, logiczne and) funkcja MPI wykonujca operacj redukcji to: 33
operacja redukcji int MPI_Reduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) MPI_Reduce przekształca argumenty operacji zapamitane w *operand stosujc operacjop i zapamituje wynik w *result w procesie root zarówno operand jak i count odnosz si do lokalizacji pamici okrelanej przez count i typ datatype 34
operacja redukcji MPI_Reduce musi by wywołane przez wszystkie procesy w komunikatorze comm, acount, datatype, i op musz by takie same w kadym procesie 35
operacja redukcji na przykład: int MPI_Reduce(&integral, &total, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); co odpowiada składni: int MPI_Reduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) 36
inne funkcje komunikacji kolektywnej MPI_Barrier MPI_Gather MPI_Scatter MPI_Allgather MPI_Allreduce 37
funkcja MPI_Barrier int MPI_Barrier(MPI_Comm comm) MPI_Barrier zapewnia mechanizm synchronizacji wszystkich procesów w komunikatorze comm kady proces blokuje si (pauzuje) dopóki kady proces w komunikatorze comm nie wywoła MPI_Barrier 38
funkcja MPI_Gather int MPI_Gather(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) kady proces wcomm nadaje zawarto bufora send_buf do procesu o numerze root proces root konkatenuje odebrane dane w porzdku okrelanym przez numery procesów w buforze recv_buf, tzn. po danych od procesu 0 s dane od procesu 1, a nastpnie dane od procesu 2, itd. argumenty recv s istotne tylko w procesie root argument recv_count wskazuje liczb elementów odebranych od kadego procesu 39
funkcja MPI_Gather [Dongarra1995] 40
funkcja MPI_Scatter int MPI_Scatter(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) proces o numerze root rozsyła zawarto bufora send_buf midzy procesami zawarto bufora send_buf jest podzielona na p segmentów, z których kady składa si z send_count elementów pierwszy segment przekazany jest do procesu 0, drugi do procesu 1, itd. argumenty send s istotne jedynie w procesie root 41
funkcja MPI_Allgather int MPI_Allgather(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) zbiera zawarto kadego bufora send_buf w kadym procesie efekt jest taki sam, jak sekwencji p wywoła MPI_Gather, z których kade ma inny proces jako root 42
funkcja MPI_Allgather [Dongarra1995] 43
zbiór funkcji MPI_Gather [Dongarra1995] 44
funkcja MPI_Allreduce MPI_Allreduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) zapamituje wynik operacji redukcjiop w buforze result kadego procesu 45
grupowanie danych dla komunikacji nadawanie komunikatu jest kosztown operacj, std im mniej komunikatów nadanych, tym lepsza efektywno programu w naszym przykładzie programu trapezowego, komunikaty s przesyłane oddzielnie (za pomocmpi_send i MPI_Recv, albo za pomocmpi_bcast) 46
grupowanie danych dla komunikacji MPI zapewnia trzy mechanizmy do grupowania pojedynczych elementów danych w jeden komunikat, s to: parametr count do rónych podprogramów wyprowadzane typy danych MPI_Pack/MPI_Unpack 47
parametrcount zauwa, e funkcje MPI_Send i MPI_Recv, MPI_Bcast i MPI_Reduce maj argumenty count i datatype te parametry pozwalaj uytkownikowi grupowa dane majce ten sam typ podstawowy w jeden komunikat warunkiem jest, aby dane były zapamitane w cigłych lokacjach pamici elementy tablicy s pamitane w cigłych lokacjach pamici, moemy wic przesła np. podzbiór tablicy 48
przykład przesłania podzbioru tablicy float vector[100] int tag, count, dest, source; MPI_Status status; int p; int my rank;... 49
przykład przesłania podzbioru tablicy if (my_rank == 0) {... /* Initialize vector and send */ tag = 47; count = 50; dest = 1; MPI_Send(vector + 50, count, MPI_FLOAT, dest, tag,mpi_comm_world); 50
przykład przesłania podzbioru tablicy }else {/*my_rank == 1 */ } tag = 47 count = 50; source = 0 MPI_Recv(vector+50, count, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); 51
parametrcount to nie pomaga w programie trapezowym dane a, b, n nie s pamitane w cigłych lokacjach pamici nawet gdy deklarujemy po kolei: float a; float b: int n; i deklarujemy n jako float 52
wyprowadzane typy danych konstruktory wyprowadzanych typów danych: gdy róne typy danych: MPI_Type_Struct gdy równe typy danych: MPI_Type_contiguous MPI_Type_vector MPI_Type_indexed 53
MPI_Pack/MPI_Unpack MPI_Pack - jawne zapamitanie danych niecigłych MPI_Unpack kopiowanie danych z bufora cigłego do niecigłych lokacji pamici 54
minimalizacja komunikacji midzy wtkami [Akhter2006] standard OpenMP powstał w 1997 jako API dla pisania przenonych aplikacji wielowtkowych w procesorach wielordzeniowych został wykorzystany do poprawy efektywnoci programów 55
wtek wtek to minimalny element dajcy si wykona (i uszeregowa), zawiera wskanik do strumienia rozkazów wykonujcych wtek, informacj o stanie procesora, i wskanik do stosu czasami nazywany lekkim procesem 56
wtek wtek naley wpierw utworzy majc wtki, mona nimi zarzdza mona si midzy nimi komunikowa mona je synchronizowa 57
komunikacja midzy wtkami [Akhter2006] dwa wtki, które rezyduj w tym samym procesie i komunikuj si za pomoc komunikatów, stosuj komunikacj wewntrzprocesow dwa wtki, które rezyduj w rónych procesach i komunikuj si za pomoc komunikatów, stosuj komunikacj midzyprocesow 58
komunikacja midzy wtkami [Akhter2006] wykonanie wtku jest sterowane przez programist funkcjami: SuspendThread, ResumeThread, TerminateThread komunikacj midzy wtkami zapewniaj Windows Events zdarzenia te naley wpierw utworzy 59
synchronizacja wtków sekcja krytyczna: kod dostpny tylko dla pewnych wtków w danym czasie semafor: struktura danych ograniczajca dostp do danej sekcji krytycznej mutex: semafor gwarantujcy wyłczny dostp do sekcji krytycznej tylko jednemu wtkowi 60
optymalizacja efektywnoci programów OpenMP zapewnia szereg narzdzi do ułatwienia programowania równoległego opartego na wtkach OpenMP zapewnia funkcje do synchronizacji wtków, zarzdzania wtkami, prywatyzacji danych 61
podział pracy w regionach równoległych [Chandra2001] konstrukcja parallel w OpenMP jest prostym sposobem zrealizowania równoległego wykonania pracy zapewnia ona powtarzalne wykonanie tego samego kodu na wielu wtkach jest te uyteczne przy podziale pracy midzy wiele wtków 62
podział pracy midzy wiele wtków [Chandra2001] albo za pomoc osobnych wtków pracujcych na rónych czciach współdzielonej struktury danych albo za pomoc osobnych wtków wykonujcych całkowicie odmienne zadania podamy teraz kilka sposobów jak to zrobi w OpenMP 63
podział pracy midzy wiele wtków przedstawimy trzy róne sposoby uzyskania podziału pracy midzy wtki pierwszy przykład pokazuje jak stworzy kolejk zada równoległych obsługiwanych przez wiele wtków drugi przykład pokazuje jak mona rcznie podzieli prac midzy wtki, wykorzystujc identyfikator kadego wtku w zespole 64
podział pracy midzy wiele wtków oba przykłady łcznie pokazuj, w jakich sytuacjach programista rcznie dzieli prac midzy wtki w zespole na koniec przedstawiamy pewne konstrukcje OpenMP dedykowane do podziału pracy midzy wtki konstrukcje te przyjły nazw konstrukcji współdzielcych wtki 65
kolejka zada równoległych jest to współdzielona struktura danych zawierajca list zada do wykonania zadania mog mie róny rozmiar i rón złoono zalenie od aplikacji moe to by np. proste przetwarzanie ptli albo złoona procedura graficzna 66
kolejka zada równoległych niezalenie od rozmiaru i złoonoci, zadania w kolejce maj nastpujce cechy: wiele zada moe by przetwarzane współbienie przez wiele wtków, z konieczn koordynacj realizowan przez jawne konstrukcje synchronizacji co wicej, dane zadanie moe by przetwarzane przez dowolny wtek z zespołu 67
kolejka zada równoległych w takim modelu kolejki zada łatwo implementuje si równoległo tworzymy zespół równoległych wtków, kady z wtków pobiera i wykonuje zadania ze współdzielonej kolejki zada w przykładzie mamy funkcj zwracajca indeks kolejnego zadania i podprogram przetwarzajcy dane zadanie 68
kolejka zada równoległych w tym przykładzie jest prosta kolejka zada, składajca si z indeksu do identyfikacji zadania funkcja get_next_task zwraca nastpny indeks do przetwarzania, a podprogram process_task pobiera indeks i wykonuje obliczenie z nim zwizane 69
kolejka zada równoległych kady wtek pobiera i przetwarza zadania, tak długo a wszystkie zadania zostan przetworzone, wtedy region równoległy si koczy i główny wtek powraca do przetwarzania szeregowego 70
implementacja kolejki zada [Chandra2001]! Funkcja do obliczenia indeksu! Nastpnego zadania do przetworzenia integer function get_next_task() common /mycom/ index integer index 71
implementacja kolejki zada [Chandra2001]!$omp critical! Sprawd czy nie jeste poza zadaniami if (index.eq. MAX) then else endif!$omp end critical return get_next_task = 1 index = index + 1 get_next_task = index end 72
implementacja kolejki zada [Chandra2001] program TaskQueue integer myindex, get_next_task!$omp parallel private (myindex) myindex = get_next_task() do while (myindex.ne. 1) call process_task (myindex) myindex = get_next_task() enddo!$omp end parallel end 73
implementacja kolejki zada przykład ten wiadomie uproszczono, zawiera on jednak wszystkie niezbdne składniki kolejki zada i mona go bez problemu uogólni na bardziej złoone algorytmy 74
podział pracy wykorzystujcy numer wtku [Chandra2001] region równoległy jest wykonywany przez zespół wtków, którego rozmiar jest okrelany albo przez programist, albo przez implementacj opart na domylnych regułach 75
podział pracy wykorzystujcy numer wtku [Chandra2001] liczb wtków w biecym zespole wtków mona okreli z wntrza regionu równoległego, wywołujc program biblioteki OpenMP: integer function omp_get_num_threads() 76
podział pracy wykorzystujcy numer wtku wtki w zespole równoległym numerowane s od 0 do liczby wtków -1 numer ten stanowi unikalny identyfikator wtku i mona go wyznaczy wywołujc program biblioteczny: integer function omp_get_thread_num() 77
podział pracy wykorzystujcy numer wtku funkcja omp_get_thread_num zwraca warto całkowit, która jest identyfikatorem wywołujcego wtku funkcja ta zwraca inn warto kiedy jest wywoływana przez inny wtek wtek główny ma identyfikator 0, a wtki podrzdne maj identyfikatory z zakresu od 1 do liczba wtków -1 78
podział pracy wykorzystujcy numer wtku poniewa kady wtek moe wyznaczy swój numer, mamy sposób na podział pracy midzy wtki mona zatem znajc liczb wtków podzieli prac na tyle czci ile jest wtków co wicej, kady wtek moe wyznaczy swoj cz pracy 79
podział pracy wykorzystujcy numer wtku [Chandra2001]!$omp parallel private(iam) nthreads = omp_get_num_threads() iam = omp_get_thread_num() call work(iam, nthreads)!$omp end parallel powyszy program ilustruje ide podziału pracy wykorzystujcego numer wtku 80
podział pracy wykorzystujcy numer wtku Kady wtek okrela nthreads (całkowit liczb wtków w zespole) i iam (jego ID w tym zespole wtków) podprogram work stosujeiam inthreads do wyznaczenia czci pracy przydzielonej temu wtkowi iam i wykonuje t cz pracy 81
podział pracy wykorzystujcy numer wtku kady wtek musi mie swój unikalny identyfikator wtku, std iam jest deklarowany jako prywatny dla kadego wtku 82
konstrukcje współdzielce wtki sporód kilku moliwoci przedstawimy jedn konstrukcj, mianowicie dyrektywdo. Dyrektywa ta np. poprzedza ptldo, uwalniajc programist od rcznego przydziału czci pracy w ptli poszczególnym wtkom 83
zastosowanie dyrektywy do [Chandra2001] program omp_do integer iarray(n)!$omp parallel...!$omp do do i = 1, N iarray(i) = i * i enddo!$omp enddo!$omp end parallel end 84
wnioski przedstawilimy podstawowe kwestie dotyczce optymalizacji komunikacji w systemach rozproszonych i równoległych istnieje potrzeba kontynuacji analizy optymalizacji komunikacji zwłaszcza w obszarze aplikacji wielowtkowych 85