Wtki w MPI 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 MPI-1 zostało zaprojektowane, aby dobrze współpracowa z wtkami MPI-2 dodało cechy, aby poprawi zdolno implementacji MPI do zwikszenia efektywnoci jednowtkowych i wielowtkowych programów 3
agenda pojcie wtku i jego przydatno podstawowe informacje o wtkach (wtki a procesy) współdziałanie MPI z wtkami (funkcja MPI_Init_thread, program zwikszania licznika) implementacja nieblokujcych operacji kolektywnych programowanie mieszane 4
wtek wtki tworz istotny model programowania, który dzieli proces na pojedyncz przestrze adresow i jeden lub wicej wtków sterowania daj naturalny model programowania dla symetrycznych wieloprocesorów s te efektywnym sposobem ukrycia opónie w operacjach o wysokich opónieniach 5
wtek wtek jest pojciem atomowym wykonania w procesie MPI. Kady proces MPI ma główny wtek i moe mie dodatkowe wtki, pod warunkiem, e jest dostpne rodowisko programowania bezpieczne ze wzgldu na wtki i pakiet wtków interfejs MPI jest bezpieczny ze wzgldu na wtki, ale nie wie MPI z adn norm poziom bezpieczestwa wtku w implementacji MPI wprowadzaj funkcje w MPI-2 6
wtek kiedy cała pami jest współdzielona, moe by zastosowana do systemów wielowtkowych, w których pojedynczy proces (przestrze adresowa) posiada kilka liczników programu i stosów wykonania model pozwala na szybkie przełczanie midzy wtkami, i nie wymaga wyranych operacji na pamici, moe by wic przeniesiony do programu w Fortranie powstaje problem: kady stan programu (zmienne programowe) jest współdzielony przez wszystkie wtki jednoczenie niezalenie, wtek moe mie pami lokaln 7
wtek a proces proces to element, który komunikuje si z innymi procesami proces definiuje si jako przestrze adresow razem z biecym stanem, zawierajcym licznik programu, wartoci rejestru, i stos wywoła do podprogramów kiedy proces ma tylko jeden licznik programu, wykonuje tylko jedn rzecz w danej chwili, wtedy jest jednowtkowy 8
wtek a proces wiele procesów moe by wykonanych przez jeden procesor poprzez współdzielenie czasu, std procesor wykonuje wicej rzeczy w jednej chwili, a proces nie uogólnienie procesu wprowadza wiele liczników programu, wartoci rejestru, i stosów wywoła podprogramów, współdzielc przestrze adresow procesu wtkiem nazywamy trójk (licznik programu, zbiór rejestrów, stos) wtek jest bardzo podobny do procesu co do jego praw, ale nie posiada własnej przestrzeni adresowej 9
wtek a proces motywacj wtków jest umoliwienie modelu programowania współbienego w pojedynczym procesie, z bardzo szybkim przełczaniem sterowania CPU z jednego wtku na drugi, wynikajcym z faktu nie angaowania, albo niewielkiego angaowania zarzdzania pamici 10
wtek a proces pojedyncze wtki nie s widoczne poza procesem std komunikacja MPI pomidzy procesami wielowtkowymi nie adresuje pojedynczych wtków wtki procesu mog wykonywa operacje MPI w imieniu swoich procesów 11
wtek a MPI stosowanie wtków łcznie z przesyłaniem komunikatów jest szczególnie wygodne, z nastpujcych powodów: wtki zapewniaj naturaln implementacj nieblokujcych operacji komunikacyjnych wtek moe by utworzony do wykonania blokujcej operacji odbioru, tak długo jak si blokuje tylko sam wtek, a nie proces, daje to efekt nieblokujcego odbioru to samo dotyczy nadawania 12
wtek a MPI wtki mog zwikszy wygod i efektywno implementacji operacji kolektywnych wtki staj si modelem programowania równoległego wybranego dla maszyn o współdzielonej pamici z symetryczn wieloprocesowoci wtki poprawiaj wydajno, pomagajc uczyni systemy o duych opónieniach systemami bardziej tolerancyjnymi na opónienia 13
wtek a proces systemy wtków, gdzie system operacyjny (jdro) nie jest zaangaowany w zarzdzanie poszczególnymi wtkami, nazywa si wtkami uytkownika wtki uytkownika s szybsze od wtków jdra, ale pewne wywołania blokuj wszystkie wtki w procesie zawierajcym wtek, który dokonał wywołania read, write, recv i send 14
wtek a proces MPI Forum było wiadome wagi istnienia wtków, i chciało, aby MPI było bezpieczne ze wzgldu na wtki w czasie powstawania MPI-1 nie było jasnej definicji wtku kwesti rozstrzyga MPI-2, wspomagajc programy wielowtkowe 15
bezpieczestwo wtku aby wtki mogły by stosowane w połczeniu z bibliotek przesyłania komunikatów, biblioteka musi dobrze współpracowa z wtkami t cech nazywamy bezpieczestwem wtku oznacza ona, e wiele wtków moe wykonywa wywołania biblioteki przesyłania komunikatów bez interferencji ze sob 16
bezpieczestwo wtku niebezpieczestwo wtku wystpuje, gdy od systemu przesyłania komunikatów oczekuje si, e utrzymuje on pewne czci stanu procesu, a nie jest to moliwe dla wicej ni jednego wtku w danym czasie niektóre biblioteki stosuj pojcie ostatnio odebranego komunikatu dla uniknicia przekazywania argumentu statusu zapamitanego na stosie procesu 17
bezpieczestwo wtku kod uytkownika wtedy wyglda nastpujco: recv(msg, type); src = get_src(); len = get_len(); podejcie to działa dla przypadku jednego wtku dla wielu wtków, moe by jednoczenie realizowane wiele odbiorów, i przy wywołaniu get_src, nie wiadomo dla którego komunikatu ródło ma by zwrócone 18
bezpieczestwo wtku MPI rozwizuje ten problem, zwracajc ródło jako cz statusu, który zwykle znajduje si na stosie danego wtku problem zasobu, bdcego własnoci biblioteki przesyłania komunikatów, zamiast wtku uytkownika, moe powsta te dla innych struktur danych, jak bufory komunikatów, pola błdu, czy biece konteksty MPI jest zaprojektowane tak, aby było bezpieczne pod wzgldem wtków 19
bezpieczestwo wtku przy stosowaniu MPI z wtkami, nie wystarczy, aby implementacja MPI była bezpieczna ze wzgldu na wtki biblioteka wtków musi bywiadoma implementacji MPI do tego stopnia, e wykonanie operacji blokujcej spowoduje, e biecy wtek oddaje sterowanie do innego wtku w procesie, zamiast spowodowa blokad procesu 20
bezpieczestwo wtku kiedy przychodzi komunikat, wtek czekajcy na niego powinien by ponownie uruchomiony co wicej, kiedy nastpuje wywołanie systemowe, system operacyjny powinien zablokowa tylko ten wtek, który dokonał wywołania, a nie wszystkie wtki, inaczej wikszo elastycznoci wtków na poziomie uytkownika jest stracona 21
bezpieczestwo wtku jest jakoci semantyki oprogramowania, która gwarantuje, e niezalenie wykonywane wtki nie interferuj ze sob, poprzez dostp do danych przeznaczonych dla innego wtku implementacja bezpieczestwa wtku wymaga eliminacji wikszoci stanów globalnych i wyranego zarzdzania pozostałymi stanami globalnymi MPI jest zaprojektowany tak, aby był bezpieczny ze wzgldu na wtki 22
bezpieczestwo wtku dwa wtki w tym samym procesie MPI odbierajce w tym samym komunikatorze wtek 1 wtek 2 ----------------------------------------------------------- MPI_Probe( s, t, comm, &st1) MPI_Probe( s, t, comm, &st2) MPI_Get_count( &st1, d, &n1) MPI_Get_count( &st2, d, &n2) MPI_Recv( a, n1, d, s, t, MPI_Recv( b, n2, d, s, t, comm, &st ) comm, &st ) 23
bezpieczestwo wtku dwa wtki próbuj odebra komunikat z procesu o numerze s w komunikatorze comm z typem danych d załómy dalej, e proces o numerze s ma nada dwa komunikaty, jeden o długoci 1, i drugi o długoci 10 moliwe wyniki kodu pokazujce długoci komunikatu zwracane przez MPI_Probe i MPI_Recv 24
bezpieczestwo wtku przypadek wtek 1 wtek 2 Probe Recv Probe Recv 1 2 3 4 1 1 1 10 1 1 10 10 10 10 1 1 1 10 1 1 25
moliwe wykonanie wtków wtek 1 MPI_Probe( s, t,comm, &status1 ) MPI_Get_count( &status1, d, &n1 ) oba wywołania MPI_Probe MPI_Recv( a, n1,d, s, t, comm, status ) wtek 2 MPI_Probe( s, t, comm, &status2 ) widz ten sam komunikat MPI_Get_count( &status2, d, &n2 ) MPI_Recv( b, n2, d, s, t, comm, status ) 26
moliwe wykonanie wtków oba wtki wywołujmpi_probe zanim oba wywołaj MPI_Recv std oba wtki dowiaduj si o pierwszym komunikacie od procesu o numerze s, komunikat ten ma rozmiar 1 nastpnie drugi wtek odbiera ten komunikat za pomoc MPI_Recv nastpnie pierwszy wtek próbuje odebra komunikat z licznikiem n1 = 1 poniewa pierwszy komunikat został ju odebrany, pierwszy wtek widzi drugi komunikat o rozmiarze 10 co powoduje błd MPI_ERR_TRUNCATE 27
bezpieczestwo wtku istnieje kilka sposobów, aby unikn tego problemu klasyczny sposób w programowaniu wielowtkowym to mechanizm wzajemnego wykluczania, taki jak zamek (lock), od MPI_Probe do MPI_Recv, chronicy przed ingerencj innego wtku MPI daje inne podejcie: poniewa komunikacja w rónych komunikatorach jest niezalena, tak długo jak aden komunikator nie jest stosowany przez wicej ni jeden wtek, nie potrzeba wzajemnego wykluczania 28
bezpieczestwo wtku MPI tak zaprojektowano, aby był implementowany w sposób bezpieczny ze wzgldu na wtki kiedy stosujesz wielowtkowo w programie, a Twoja implementacja nie jest bezpieczna, moesz otrzyma nieprzewidywalne wyniki 29
programy jeszcze jedna wersja nxtval (zwikszanie licznika i zwrot wartoci) implementacja nieblokujcych operacji kolektywnych testowanie poziomu wsparcia wtków 30
MPI i wtki MPI_1 został zaprojektowany aby był bezpieczny ze wzgldu na wtki z wyjtkiem MPI_Probe i MPI_Iprobe, nie ma stanu globalnego ani pojcia biecej wartoci w specyfikacji MPI W MPI-2, programy we/wy zawierajce wyrane offsety (MPI_File_read_at) daj bezpieczn alternatyw operacji seek 31
MPI i wtki problem przenonoci w aplikacjach wielowtkowych ze wzgldu na podział na wtki uytkownika i wtki jdra, wymaga, aby wywołania MPI blokowały jedynie wtek wywołujcy kiedy aplikacja stosuje MPI dla komunikacji miedzy procesami, a jest wielowtkowa, to jest wtedy przenona 32
MPI i wtki jeden wtek moe rozpocz operacj nieblokujc, a inny wtek (ale tylko jeden) moe j zakoczy potrzebne s operacje, zabezpieczajce przed niespójnymi aktualizacjami lokalizacji pamici 33
funkcja MPI_Init_thread funkcja ta da poziomu wsparcia wtku, i zwraca gwarantowany poziom wtku podamy obecnie poziomy wsparcia wtku, w kolejnoci wzrastajcej ogólnoci wszystkie wartoci poziomu wsparcia s liczbami całkowitymi i s uporzdkowane tak, e ogólniejsza warto jest wiksza ni wszystkie bardziej restryktywne poziomy 34
poziomy wsparcia wtku MPI_THREAD_SINGLE: tylko jeden wtek (uytkownika) MPI_THREAD_FUNNELED: wiele wtków uytkownika, ale tylko główny wtek moe dokona wywoła MPI MPI_THREAD_SERIALIZED: wiele wtków uytkownika moe dokona wywoła MPI, ale tylko jeden wtek w danej chwili to robi MPI_THREAD_MULTIPLE: pełna dowolno, dowolny wtek moe dokona wywołania w dowolnym czasie 35
funkcja MPI_Init_thread MPI_Init_thread moe by uyta zamiast MPI_Init to znaczy kiedy program MPI-1 startuje z MPI_Init i koczy simpi_finalize, to program MPI-2 startuje od MPI_Init albo MPI_Init_thread, a koczy simpi_finalize wtek w kadym procesie, który wywołałmpi_init lub MPI_Init_thread, który jest nazwany głównym wtkiem, jest równie tym jedynym wtkiem w procesie, który wywołuje MPI_Finalize 36
funkcja MPI_Init_thread najbardziej przyjaznym wtkom jest poziom MPI_THREAD_MULTIPLE programy MPI mog by wtedy stosowane w dowolnej kombinacji z wtkami MPI sam nie tworzy wtków, s one tworzone osobno przez biblioteki i kompilatory 37
wersjanxtval z uyciem wtków program zwikszania licznika z uyciem wtków wtek zapewnia tutaj licznik wtek stosuje blokujcy odbiór, aby czeka na dania nowej wartoci, a zwraca dane blokujcym nadawaniem kod programu przedstawiony jest na kolejnych slajdach 38
wersjanxtval z uyciem wtków proces o numerze 0 tworzy wtek w init_counter dowolny proces, moe wywoła counter_nxtval, aby pobra biec warto i zwikszy j o warto incr program stop_counter stosuje MPI_Barrier do zapewnienia, e aden proces nadal nie próbuje korzysta z licznika 39
wersjanxtval z uyciem wtków proces o numerze 0 nadaje komunikat do samego siebie, odebrany jest on w programie counter_routine, działajcym w oddzielnym wtku odbiór tego komunikatu powoduje wyjcie z counter_routine, koczc wtek wywołanie pthread_join w stop_counter, powoduje, e proces który utworzył wtek, czeka a wtek si zakoczy 40
wersjanxtval z uyciem wtków kod zaley od gwarancji MPI, e blokujce wywołanie MPI blokuje jedynie wtek wywołujcy to wymaga trybu MPI_THREAD_MULTIPLE, ale tylko jeden proces potrzebuje takiego poziomu wsparcia inne procesy nie potrzebuj wtków, wtedy stosuj poziom wsparcia MPI_THREAD_SINGLE 41
wersjanxtval z uyciem wtków zmienna thread_id jest globalna, to chroni przed tym, aby wicej ni jeden licznik był aktywny w danym czasie w jednym procesie MPI zapewnia wygodny sposób dołczenia tej zmiennej do komunikatora wyjciowego counter_comm_p, za pomoc atrybutów 42
wersjanxtval z uyciem wtków void *counter_routine(mpi_comm *counter_comm_p ) { init incr, ival = 0; MPI_Status status; while (1) { MPI_Recv( &incr, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, *counter_comm_p, &status ); if (status.mpi_tag == 1) return ); MPI_Send( &ival, 1, MPI_INT, status.mpi_source, 0, *counter_comm_p ); ival += incr; } } 43
wersjanxtval z uyciem wtków /* omawiamy jak eliminowa t zmienn globaln w tekcie */ static pthread_t thread_id; void init_counter( MPI_Comm comm, MPI_Comm *counter_comm_p ) { int rank; MPI_Comm_dup( comm, counter_comm_p ); MPI_Comm_rank( comm, &rank ); if (rank == 0) pthread_create( &thread_id, NULL, counter_routine, counter_comm_p ); } 44
wersjanxtval z uyciem wtków /* dowolny proces moe to wywoła, aby pobra i zwikszy przez warto */ void counter_nxtval( MPI_Comm counter_comm, int incr, int *value ) { } MPI_Send(&incr, 1, MPI_INT, 0, 0, counter_comm); MPI_Recv(value, 1, MPI_INT, 0, 0, counter_comm, MPI_STATUS_IGNORE); 45
wersjanxtval z uyciem wtków /* kady proces w counter_comm (włczajc numer 0!) musi wywoła zatrzymanie licznika */ void stop_counter( MPI_Comm *counter_comm_p ) { } int rank; MPI_Barrier( *counter_comm_p); MPI_Comm_rank( *counter_comm_p, &rank ); if (rank == 0) { MPI_Send( MPI_BOTTOM, 0, MPI_INT, 0, 1, *counter_comm_p ); pthread_join( thread_id, NULL ); } MPI_Comm_free( counter_comm_p ); 46
nieblokujce operacje kolektywne wikszo operacji nieblokujcych moe by widziana, jak by były implementowane jako operacje blokujce w oddzielnych wtkach to jest przyczyna, dlaczego nieblokujce operacje kolektywne nie s zawarte w MPI-2, gdy mog by implementowane przez wywołanie odpowiadajcej operacji blokujcej z wykorzystaniem oddzielnego wtku 47
nieblokujce operacje kolektywne przykładem jest MPI_Comm_accept operacja ta nie moe by usunita, (nie jest nieblokujca), std program MPI wywołujcy MPI_Comm_accept nie moe si kontynuowa, a nie nastpi powrót z MPI_Comm_accept moemy uy inny program MPI, który wykona puste danie połczenia do samego siebie, aby spełni MPI_Comm_accept 48
kod nawizania i rozłczenia połczenia integer wxit_msg, server parameter (exit_msg = -1)... call MPI_COMM_CONNECT( port_name, MPI_INFO_NULL, 0, &MPI_COMM_SELF, server, ierr ) call MPI_BCAST(exit_msg, 1, MPI_INTEGER, MPI_ROOT, &server, ierr ) call MPI_COMM_DISCONNECT(server, ierr) 49
programowanie mieszane połczenie przesyłania komunikatów z technikami współdzielenia pamici tryb wtku MPI: MPI_THREAD_FUNNELED tylko jeden wtek wykonuje wywołanie MPI wtek musi okreli, czy jest głównym wtkiem, wywołujc MPI_Is_thread_main inne wtki wyliczaj zadanie zrównoleglenie ptli przez wtki 50
testowanie poziomu wsparcia wtków kod wykorzystuje fakt uporzdkowania wartoci poziomów wsparcia do uproszczenia testu MPI_Query_thread i MPI_Is_thread_main mog by uyte, nawet gdy MPI jest inicjowane przezmpi_init zamiast przez MPI_Init_thread 51
testowanie poziomu wsparcia wtków int thread_level, thread_is_main; MPI_Query_thread( &thread_level ); MPI_Is_thread_main( &thread_is_main ); if (thread_level > MPI_THREAD_FUNNELED (thread_level == MPI_THREAD_FUNNELED && thread_is_main)) {... moemy zrobi wywołania MPI } 52
testowanie poziomu wsparcia wtków else { printf( Błd, program robi wywołania MPI\n\ Ten wtek ich nie wspomaga\n ); return 1; }... 53
stosowanie programów MPI z OpenMP w OpenMP uytkownik moe kontrolowa liczb wtków zmiennymi rodowiska w MPI moe ustawi t liczb program omp_set_num_threads zwraca liczb wtków 54
kod do ustawienia wtków OpenMP w programie MPI MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { nthreads_str = getenv( OMP_NUM_THREADS ); if (nthreads_str) else nthreads = atoi( nthreads_str ); nthreads = 1; } MPI_Bcast( &nthreads, 1, MPI_INT, 0, MPI_COMM_WORLD ); omp_set_num_threads( nthreads ); 55
podsumowanie omówilimy tutaj podstawowe kwestie wtków w MPI temat ten nie wyczerpuje problematyki MPI nastpnym krokiem bdzie omówienie bibliotek graficznych w MPI 56