OpenMP Szkolenie dla uytkowniku w zasobów w PCSS Mirosław Kupczyk miron@man.poznan.pl PCSS 7.11.2006 1
Plan 11:00-12:30 Wykład Standard OpenMP Dyrektywy kompilatora Sterowanie w obszarach równoległych 12:30-12:45 Przerwa 12:45-14:15 wiczenia praktyczne 2
OpenMP Open specifications for Multi Processing to standard programowania komputerów równoległych (SMP) implementowany na wiekszoci platformach obliczeniowych i dostarczany w postaci API dla programisty. Dostarcza mechanizmów korzystajcych w sposób jawny z wielowtkowoci i pamici współdzielonej w trybie równoległym. PCSS 3
Co to jest OpenMP!= MPI Dyrektywy dla kompilatora Biblioteki procedur (runtime) Zmienne rodowiskowe Przenaszalno (na 99,99%) Wsparcie dla C/C++, Fortran Znakomity do przetwarzania równoległego na poziomie ptli (z pewnymi wyjtkami dot. zalenoci danych i zmiennych ptli). Standaryzacja OpenMP nie wspiera systemów z rozproszon pamici (np. klastry) Implementacje nie s identycznie implementowane w systemach. Brak gwarancji wydajnego/optymalnego wykorzystania pamici współdzielonej. PCSS 4
Historia Wczesne lata 90-te rozszerzenia dla Fortrana. Draft ANSI X3H5 in 1994 (nigdy nie zaakceptowany) Oficjalne prace nad standardem zaczły si w 1997 (Compaq/HP, SGI, Intel, US DOE, IBM, SUN,...) Oct 1997: Fortran version 1.0 Oct 1998: C/C++ version 1.0 Nov 2000: Fortran version 2.0 Mar 2002: C/C++ version 2.0 May 2005: C/C++ and Fortran version 2.5 http://www.openmp.org Uwaga: niektóre dyrektywy zmieniły nazw w kolejnych wersjach OpenMP. PCSS 5
Dostpne na komputerach KDM SGI Origin 3800 (grape) 96 procesorów SGI Altix 3700 (guarana) 128 procesorów Równie na klastrach: Intel IA-64 (sherwood) wzły 2-u procesorowe AMD Opteron64 (fangorn) wzły 2-u procesorowe (2 * 2 rdzenie) Uruchamianie zada OpenMP w klastrze rozproszonym: cluster-openmp nastpne szkolenie!! PCSS 6
Model programowania Model bazuje na tworzeniu i usuwaniu wtków w obszarach równoległych [w skr. OR] (fork-join). Programista decyduje jawnie (w kodzie programu) o tym, które i jakie wtki bd wykonywa si równolegle. Zawsze startuje pojedyczy proces. Tworzy n-1 wtków w OR. OR koczy si synchronizacj i porzdkowaniem. Zostaje master. API oferuje zagniedzony parallelizm i dynamiczne tworzenie wtków (zmiana liczby wtków w aktywnym RO). Implementacje rzadko wspieraj. Standard nie wspomina o I/O PCSS 7
Przykład programu w C/C++ #include <omp.h> main () { int var1, var2, var3; // Kod sekwencyjny:... /* Pocztek obszaru równoległego. Tworzenie wtków. Ustalenie zasiegu zmiennych */ #pragma omp parallel private(var1, var2) shared(var3) { // Obszar równoległy, wykonywany przez wszystkie wtki:.. // Koniec obszaru równoległego. Synchronizacja i likwidacja wtków. } // Pozostały kod sekwencyjny:.. return 0; } PCSS 8
Przykład programu w Fortranie PROGRAM HELLO INTEGER VAR1, VAR2, VAR3 Serial code... Beginning of parallel section. Fork a team of threads. Specify variable scoping!$omp PARALLEL PRIVATE(VAR1, VAR2) SHARED(VAR3) Parallel section executed by all threads.. All threads join master thread and disband!$omp END PARALLEL Resume serial code.. END PCSS 9
Format dyrektywy C/C++ #pragma omp nazwa dyrektywy [warunek1,...] Nowa linia NL Wymagane Wystpuje zawsze po pragmie i przed warunkami Opcjonalne. Porzdek dowolny Wymagane. Poprzedza blok równoległy. Przykład: #pragma omp parallel default(shared) private(alfa, beta, i, j, k) Zasady ogólne: - Case sensitive; - Konwecja dyrektywy odpowiednia dla C/C++; - Tylko jedna nazwa na dyrektyw; - Kada dyrektywa dotyczy najbliszego nastpujcego bloku kodu; - Długa dyrektywa moe zosta przeniesiona do kolejnej linii po znaku \. PCSS 10
Zasig g dyrektywy Obszar statyczny Ustrukturyzowany kod programu wystpujcy zaraz po dyrektywie. Nie uruchamia równoległych procedur, nie generuje kopii pliku ródłowego. Sierota Dyrektywa niezalena od dyrektywy nadrzdnej. Istnieje poza obszarem ustrukturyzowanego kodu dyrektywy. Moe wywoływa procedury i pliki z kodami. Obszar dynamiczny Zawiera obszary: statyczny i swoich osieroconych dyrektyw. Wane, poniewa w przypadku błdnie wpisanej dyrektywy program równie moe da wyniki (właciwe lub nie). PCSS 11
Lista dyrektyw omp #pragma omp parallel for sections single master critical barrier atomic flush ordered PCSS 12
PARALLEL C/C++ Fortran #pragma omp parallel [clause...] newline if (scalar_expression) private (list) shared (list) default (shared none) firstprivate (list) reduction (operator: list) copyin (list) structured_block!$omp PARALLEL [clause...] IF (scalar_logical_expression) PRIVATE (list) SHARED (list) DEFAULT (PRIVATE SHARED NONE) FIRSTPRIVATE (list) REDUCTION (operator: list) COPYIN (list) block!$omp END PARALLEL Uwagi: - Kiedy wtek (master) osignie obszar PARALLEL, tworzy zespół wtków. Master jest członkiem zespołu i ma nr 0. - Kod jest duplikowany i kady z wtków go wykonuje. - Na kocu obszaru jest bariera, któr przekracza tylko wtek master. - W przypadku zakoczenia si wtku w obszarze PARALLEL, wszystkie wtki w zespole s koczone a stan pracy w takim punkcie jest nieokrelony (nie musi to oznacza koca całego programu). - Zagniedzenie moliwe po ustawieniu zmiennej rodowiskowej: OMP_NESTED=true Wówczas liczba wtków programu (runtime) wyniesie: n^2. PCSS 13
O wtkach... w Liczba wtków w obszarze PARALLEL: > setenv OMP_NUM_THREADS 16 albo funkcja API: #include <omp.h> omp_set_num_threads( 16 ) ; Moe zalee od implementacji bibliotek OpenMP, np. liczba procesorów w wle. Numeracja wtków: <0..N-1> Dynamiczna: omp_get_dynamic(); sprawdzenie, jeli wspiera to: omp_set_dynamic(); lub ustaw zmiennrodowiskow: > setenv OMP_DYNAMIC TRUE PCSS 14
Warunki IF Warunek wejcia do obszaru PARALLEL: Fortran:.TRUE. C/C++: nie-zero W przeciwnym razie wtek master wykona blok kodu sekwencyjnie. Nie wolno dokonywa skoków do/na zewntrz obszaru równoległego! Równie nie wolno skaka pomidzy niezalenymi obszarami równoległymi. PCSS 15
Przykład C/C++ #include <omp.h> main () { int nthreads, tid; /* Fork a team of threads giving them their own copies of variables */ #pragma omp parallel private(tid) { /* Obtain and print thread id */ tid = omp_get_thread_num(); printf("hello World from thread = %d\n", tid); /* Only master thread does this */ if (tid == 0) { nthreads = omp_get_num_threads(); printf("number of threads = %d\n", nthreads); } } /* All threads join master thread and terminate */ > export OMP_NUM_THREADS=8 > icc -openmp hello.c >./a.out Hello World from thread = 0 Number of threads = 8 Hello World from thread = 1 Hello World from thread = 2 Hello World from thread = 5 Hello World from thread = 4 Hello World from thread = 3 Hello World from thread = 6 Hello World from thread = 7 Uwaga na nieporzdek w dostpie do urzdzenia tty. } PCSS 16
Sterowanie w obszarze równoległym Ptla: for() Niezalene sekcje (równoległo na poziomie procedur) Serializacja danego kodu PCSS 17
Ptla C/C++ #pragma omp for [clause...] schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) nowait NL for(...){ ciało ptli } #pragma omp parallel private(i) { #pragma omp for for(i=0;i<400;i++) {... } } PCSS 18
warunki SCHEDULE STATIC ptla jest dzielona na fragmenty o wielkoci chunk-size a jej kawałki przydzielone arbitralnie kademu z wtków. DYNAMIC - ptla jest dzielona na fragmenty o wielkoci chunk-size a jej kawałki przydzielone dynamicznie kademu z wtków. Warto włczy, gdy krok iteracji ma z góry nieznany czas wykonania. GUIDED chunk-size jest obliczany na podstawie liczby pozostałych niewykonanych jeszcze iteracji. RUNTIME zaley od zmiennej rodowiskowej OMP_SCHEDULE NOWAIT wtki nie synchronizuj si na kocu ptli. Ograniczenia ptli: - Liczba iteracji znana. Ptla nie moe mie charakteru ptli do...while. - Nie wolno wykonywa instrukcji skoku poza ptle. - Chunk-size musi mie niezmienn wielko (int). PCSS 19
SECTIONS #pragma omp sections [clause...] private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait NL { #pragma omp section newline - Obszar w którym wykonuj si bloki kodu w odzielnych wtkach (nie iteracje). - Kada sekcja jest wykonywana tylko raz przez wtek. - Na kocu sections jest bariera, wykonywana zawsze i niezalenie od ustawienia nowait. - Jeli liczba sekcji jest wiksza ni liczba wtków implementacja OpenMP zadecyduje o rezultacie. structured_block #pragma omp section newline structured_block } PCSS 20
SINGLE - Fragment kodu zostanie wykonany tylko przez jeden wtek. Np.. Operacja I/O. Reszta wtków czeka. - Na kocu bloku jest domylnie bariera, niezalenie od ustawienia NOWAIT. #pragma omp single [clause...] private (list) firstprivate (list) nowait NL structured_block PCSS 21
Synchronizacja wtkw tków Przykład: Wtek 1: increment(x) { x = x + 1; } Wtek 2: increment(x) { x = x + 1; } Bez dodatkowych załoe, rezultat powyszych operacji bdzie nieprzewidywalny, tzn. warto zmiennej x bdzie zwikszona albo o 1, albo o 2. OpenMP ma mechanizmy do sterowania kolejnoci wykonywania si wtków. Dyrektywy: MASTER CRITICAL BARRIER ATOMIC FLUSH ORDERED PCSS 22
Synchronizacja c.d. #pragma omp master NL structured_block Tylko watek master wykonuje dany blok kodu. Brak bariery. #pragma omp critical [ nazwa ] NL structured_block Fragment kodu bdzie wykonany przez wszytkie wtki. Tylko jeden wtek działa w danym czasie, pozostałe czekaj na wykonanie. Nazw nadaje programista, moe istnie wiele obszarów CRITICAL z tak sam nazw, wówczas takie obszary s traktowane jako jeden. #include <omp.h> main() { int x; x = 0; #pragma omp parallel shared(x) { } #pragma omp critical x = x + 1; } /* end of parallel section */ PCSS 23
Synchronizacja c.d. #pragma omp barrier NL #pragma omp atomic NL statement_expression Odpowiednik sekcji mini-critical. Operacja atomowa na pamici. #pragma omp flush (list) NL Punkt synchronizacji po którym implementacja OpenMP musi zapewni spójno pamici. Konieczna równie w systemach cc (cache coherent) np. SGI Origin, Altix Domylnie jest wykonywana w ramach dyrektyw: barrier parallel critical ordered for sections single pocztek i koniec pocztek i koniec pocztek i koniec koniec koniec koniec #pragma omp ordered NL structured_block Iteracje w ptli wykonaj si w tym samym porzdku co ptla na jednym procesorze. Dotyczy tylko dyrektywy omp for. Moe si zday, e cz mocy obliczeniowej zostanie niewykorzystana (w rodku jest wywoływane omp flush). PCSS 24
THREADPRIVATE #include <omp.h> int a, b, i, tid; float x; #pragma omp threadprivate(a, x) main () { /* Explicitly turn off dynamic threads */ omp_set_dynamic(0); printf("1st Parallel Region:\n"); #pragma omp parallel private(b,tid) { tid = omp_get_thread_num(); a = tid; b = tid; x = 1.1 * tid +1.0; printf("thread %d: a,b,x= %d %d %f\n",tid,a,b,x); } /* end of parallel section */ printf("************************************\n"); printf("master thread doing serial work here\n"); printf("************************************\n"); printf("2nd Parallel Region:\n"); #pragma omp parallel private(tid) { tid = omp_get_thread_num(); printf("thread %d: a,b,x= %d %d %f\n",tid,a,b,x); } /* end of parallel section */ } Wynik: 1st Parallel Region: Thread 0: a,b,x= 0 0 1.000000 Thread 2: a,b,x= 2 2 3.200000 Thread 3: a,b,x= 3 3 4.300000 Thread 1: a,b,x= 1 1 2.100000 ************************************ Master thread doing serial work here ************************************ 2nd Parallel Region: Thread 0: a,b,x= 0 0 1.000000 Thread 3: a,b,x= 3 0 4.300000 Thread 1: a,b,x= 1 0 2.100000 Thread 2: a,b,x= 2 0 3.200000 Globalizacja zmiennych lokalnych z punktu widzenia wtku. Wartoci zdefiniowanych zmiennych s zachowywane pomidzy obszarami równoległymi. Dynamiczne tworzenie wtków naley w tym przypadku wyłczy. PCSS 25
#include <omp.h> main () { int i, n, chunk; float a[100], b[100], result; /* Some initializations */ n = 100; chunk = 10; result = 0.0; for (i=0; i < n; i++) { a[i] = i * 1.0; b[i] = i * 2.0; } #pragma omp parallel for \ default(shared) private(i) \ schedule(static,chunk) \ reduction(+:result) for (i=0; i < n; i++) result = result + (a[i] * b[i]); printf("final result= %f\n",result); } REDUCTION Proste operacje na zagregowanych zmiennych prywatnych. Składnia: reduction (operator: lista) Zmienne operandy typu prostego (skalarne), koniecznie jako SHARED. Operator nieprzeciony: +, *, -, /, &, ^,, &&, Uwaga: reguła łcznoci argumentów zmiennoprzecinkowych moe powodowa róne wyniki. PCSS 26
warunki / dyrektywy Dyrektywa Warunek PARALLEL DO/for SECTIONS SINGLE PARALLEL DO/for PARALLEL SECTIONS IF PRIVATE SHARED DEFAULT FIRSTPRIVATE LASTPRIVATE REDUCTION COPYIN SCHEDULE ORDERED NOWAIT PCSS 27
Uyteczne informacje Zadanie równoległe zlecamy do kolejki przeznaczonej dla zada równoległych. Do programisty naley takie wykorzystanie zasobów, by minimalizowa straty mocy obliczeniowej w obszarach nierównoległych kodu. Administrator dopuszcza zwikszenie liczby slotów czasowych na maszynach. Zwykle jest to ok. 10% liczby procesorów. Jeli braknie pamici lokalnej dla wtku uywamy: export KMP_STACKSIZE=20000000 PCSS 28
wiczenia > ssh guarana.man.poznan.pl nazwa uytkownika: ***** hasło: ***** wget http://szkolenia.man.poznan.pl/presentations/openmp/openmp.tar PCSS 29
Altix3700 Niederministyczny czas wykonania zadania równoległego w zwizku z rón odległoci (hopy) pomidzy procesorami cecha architektury. Mona temu zaradzi! PCSS 30
Pierwszy program 1. Zobacz plik:> cat hello.c 2. Kompilacja: > icc -openmp hello.c -ohello hello.c(8) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED. 3. Uruchamianie w systemie kolejkowym PBS: Przygotuj plik konfiguracyjny: > cat hello.sh #!/bin/bash #PBS -l ncpus=4 #PBS -l mem=3gb export OMP_NUM_THREADS=4 /home/staff/miron/progs/openmp/hello 4. Zlecenie do PBS: > qsub hello.sh 5184.guarana.man.poznan.pl 5. Status zadania w PBS: > qstat 5184.guarana.man.poznan.pl 6. Pliki wynikowe: -rw------- 1 miron staff 0 2006-11-06 14:47 hello.sh.e5184 -rw------- 1 miron staff 134 2006-11-06 14:47 hello.sh.o5184 7. > cat hello.sh.o5184 Hello World from thread = 0 Number of threads = 4 Hello World from thread = 3 Hello World from thread = 1 Hello World from thread = 2 8. Wykonaj go kilka razy!! PCSS 31
Mnoenie macierzy (ptle) 1. Zobacz plik:> cat multi.c 2. Kompilacja: > icc -openmp multi.c -omulti 3. Uruchamianie w systemie kolejkowym PBS: Przygotuj plik konfiguracyjny: > cat multi.sh #!/bin/bash #PBS -l ncpus=8 #PBS -l mem=3gb export OMP_NUM_THREADS=8 ulimit -s 9999999999 /home/staff/miron/progs/openmp/multi 4. Zlecenie do PBS: > qsub multi.sh 5184.guarana.man.poznan.pl 5. Status zadania w PBS: > qstat 5184.guarana.man.poznan.pl 6. Pliki wynikowe: -rw------- 1 miron staff 0 2006-11-06 14:47 hello.sh.e5184 -rw------- 1 miron staff 134 2006-11-06 14:47 hello.sh.o5184 7. > cat hello.sh.o5184 8. Historia zadania: Prosty accounting: tracejob -n <liczba_dni_wstecz> <nr_zadania> PCSS 32
Sekcje 1. Zobacz plik:> cat section.c 2. Kompilacja: > icc -openmp section.c -osection 3. Uruchamianie w systemie kolejkowym PBS: Przygotuj plik konfiguracyjny: > cat section.sh #!/bin/bash #PBS -l ncpus=8 #PBS -l mem=3gb export OMP_NUM_THREADS=8 /home/staff/miron/progs/openmp/section 4. Zlecenie do PBS: > qsub section.sh 5184.guarana.man.poznan.pl 5. Status zadania w PBS: > qstat 5184.guarana.man.poznan.pl 6. Pliki wynikowe: -rw------- 1 miron staff 0 2006-11-06 14:47 hello.sh.e5184 -rw------- 1 miron staff 134 2006-11-06 14:47 hello.sh.o5184 7. > cat hello.sh.o5184 8. Historia zadania: Prosty accounting: tracejob -n <liczba_dni_wstecz> <nr_zadania> PCSS 33
Błdy do znalezienia bug1.c PCSS 34
Błdy do znalezienia bug1.c Pomidzy PARALLEL FOR i for() nie powinny znale siadne instrukcje. PCSS 35
Błdy do znalezienia bug2.c PCSS 36
Błdy do znalezienia bug2.c Zasig zmiennych tid i total jest błdny. Tid i total powinny by prywatne. Co programista chciał przez to uzyska (for.. )? PCSS 37
Błdy do znalezienia bug3.c PCSS 38
Błdy do znalezienia bug3.c Z definicji dyrektywa omp_barrier nie moe by ulokowana na zewntrz bloku sekcji w obszrze SECTIONS. PCSS 39
Błdy do znalezienia bug4.c PCSS 40
Błdy do znalezienia bug4.c Stos wtku jest zbyt mały (SEGV). # This is for all systems limit stacksize unlimited (albo: ulimit -s 999999999 dua liczba) # This is for IBM AIX systems setenv XLSMPOPTS "stack=20000000" # This is for IA-32 Linux systems setenv KMP_STACKSIZE 20000000 PCSS 41
Błdy do znalezienia bug5.c PCSS 42
Błdy do znalezienia bug5.c deadlock > bug5fix.c PCSS 43
Błdy do znalezienia bug6.c PCSS 44
Błdy do znalezienia bug6.c Zły zasig zmiennej sum. PCSS 45