Szálak. Grid és OO labor (1. labor) Párhuzamos programozás szálakkal OpenMP, UPC. pthread példa/2. pthread példa. pthread_mutex.

Hasonló dokumentumok
Nagyteljesítményű párhuzamos feldolgozás (3. ea)

Párhuzamos és Grid rendszerek

Párhuzamos és Grid rendszerek. Áttekintés. Szálak. Eddig általános eszközöket láttunk, melyek

Bevezetés a párhuzamos programozási koncepciókba

Párhuzamos és Grid rendszerek

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Párhuzamos programozási platformok

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

OpenCL - The open standard for parallel programming of heterogeneous systems

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Pénzügyi algoritmusok

Programozás II. 2. Dr. Iványi Péter

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Programozás I. 5. Előadás: Függvények

Párhuzamos programozási platformok

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Programozás 6. Dr. Iványi Péter

Programozás I. gyakorlat

Programozás alapjai 9.Gy: Struktúra 2.

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

OOP #14 (referencia-elv)

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Párhuzamos programok futásának kiértékelése Scalasca profiler segítségével

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás 5. Dr. Iványi Péter

Magas szintű optimalizálás

Programozási nyelvek Java

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Bevezetés a programozásba. 9. Előadás: Rekordok

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Pénzügyi algoritmusok

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Vezérlési szerkezetek

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Alprogramok, paraméterátadás

Programozás alapjai II. (7. ea) C++

10. gyakorlat Tömb, mint függvény argumentum

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás II. 4. Dr. Iványi Péter

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

Java és web programozás

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Szövegek C++ -ban, a string osztály

Programozas 1. Strukturak, mutatok

Programozás C és C++ -ban

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Bevezetés a programozásba I.

Kereső algoritmusok a diszkrét optimalizálás problémájához

A programozás alapjai 1 Rekurzió

Dr. Schuster György október 14.

Párhuzamos és Grid rendszerek

Programozás I gyakorlat. 10. Stringek, mutatók

Kivételkezelés a C++ nyelvben Bevezetés

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Kereső algoritmusok a diszkrét optimalizálás problémájához

Programozás C++ -ban 2007/4

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Programozási nyelvek JAVA EA+GY 1. gyakolat

C++ programozási nyelv Konstruktorok-destruktorok

Operációs rendszerek. Az NT folyamatok kezelése

Programozás C++ -ban 2007/1

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

9. MPI

7. fejezet: Mutatók és tömbök

Programozás C++ -ban

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

C programozási nyelv

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Operációs rendszerek III.

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Programozási nyelvek Java

Web-technológia PHP-vel

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Java és web programozás

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Mutatók és mutató-aritmetika C-ben március 19.

Átírás:

Grid és OO labor (1. labor) Párhuzamos programozás szálakkal OpenMP, UPC Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 2014.10.28. - 1 - Szálak A processzek memóriaterületei egymástól teljesen elkülönítettek. A szálak olyan processzek, melyeknek csak a stack területe különül el. Így lényegesen gyorsabban lehet váltani közöttük, valamint könnyebben is kommunikálnak egymással. pthread_create(), pthread_join(), pthread_exit() pthread_mutex_..., pthread_cond_... 2014.10.28. - 2 - pthread példa #include <stdio.h> #include <pthread.h> void* do_loop(void *id) int i, j; float f = 0; char me = *(char *)id; for (i=0; i<10; i++) for (j=0; j<5000000; j++) f++; printf("thread_%c: %d\n", me, i); pthread_exit(null); thread-et megvalósító függvény thread egyedi adata 2014.10.28. - 3 - pthread példa/2 int main(int argc, char* argv[]) pthread_t thread_a, thread_b; thread leírója char a='a', b='b', c='c'; pthread_create(&thread_a, NULL, do_loop, &a); pthread_create(&thread_b, NULL, do_loop, &b); do_loop(&c); printf("ide nem jut!\n"); return 0; megvalósító függvény egyedi paraméter 2014.10.28. - 4 - Kölcsönös kizárás mutex: pthtread_mutex_init pthtread_ mutex_destroy pthtread_ mutex_lock pthtread_ mutex_trylock pthtread_ mutex_unlock pthread_mutex pthread_mutex_t mutex_cnt; pthread_mutex_init(&mutex_cnt, NULL); pthread_mutex_lock(&mutex_cnt); // kritikus régió pthread_mutex_unlock(&mutex_cnt); 2014.10.28. - 5-2014.10.28. - 6-1

Feltétel változó condition: pthtread_ cond_init pthtread_ cond_destroy pthtread_ cond_wait pthtread_ cond_timedwait pthtread_ cond_signal pthtread_ cond_broadcast pthread_cond pthread_mutex_t mutex_cnt; pthread_cond_t cond_cnt; pthread_mutex_init(&mutex_cnt, NULL); pthread_cond_init(&cond_cnt, NULL); // egyik szál pthread_mutex_lock(&mutex_cnt); // kritikus régió, várni kell valamire pthread_cond_wait(&cond_cnt, &mutex_cnt); pthread_mutex_unlock(&mutex_cnt); 2014.10.28. - 7-2014.10.28. - 8 - pthread_cond (2) // másik szál pthread_mutex_lock(&mutex_cnt); // a várt esemény bekövetkezett pthread_cond_signal(&cond_cnt); pthread_mutex_unlock(&mutex_cnt); OpenMP Nyelvi annotáció A programozó a funkcionalitásra koncentrálhat. A párhuzamosítás csak lehetőség. Shared memóriás párhuzamosítás Ipari szabvány openmp.org, computing.llnl.gov/tutorials/openmp 2014.10.28. - 9-2014.10.28. - 10 - Végrehajtási modell Shared memoria modell Master thread FORK JOIN FORK JOIN A szálak változókon keresztül kommunikálnak. A megosztás nyelvi szinten definiált Versenyhelyzet kialakulhat Szinkronizációs eszközök Megosztás minimalizálása 2014.10.28. - 11-2014.10.28. - 12-2

Szintaxis #pragma omp construct [clause [clause] ] Egy blokkra vonatkozik (egy belépés, egy kilépés) OpenMP konstrukciók típusai: Parallel regions Work sharing Data Environment Synchronization Runtime functions/environment variables Paralell regions double D[1000] = 1, 2, 3, 4 ; #pragma omp parallel shared private int i; double sum = 0; for (i=0; i<1000; i++) sum += D[i]; printf( Thread %d computes %f\n, omp_get_thread_num(), sum); // annyiszor fut, ahány thread van. 2014.10.28. - 13-2014.10.28. - 14 - Work sharing Kézi párhuzamosítás #pragma omp sections #pragma omp section a = computation_1(); #pragma omp section b = computation_2(); c = a + b; Hosszú futási idejű valami for (int i=0; i<n; i++) a[i]=b[i]+c[i]; #pragma omp parallel int id = omp_get_thread_num(); int nthr = omp_get_num_threads(); int istart = id*n/nthr, iend = (id+1)*n/nthr; for (int i=istart; i<iend; i++) a[i]=b[i]+c[i]; 2014.10.28. - 15-2014.10.28. - 16 - Automatikus párhuzamosítás #pragma omp parallel #pragma omp for schedule(static) for (int i=0; i<n; i++) a[i]=b[i]+c[i]; Csak egyszerű for ciklus lehet: 1 db int ciklusváltozó, cmp. op: <, >, <=, > Növelés/csökkentés: ++, --, értékadó op. Ciklusfüggetlen init, last, növelés Párhuzamos for problémai Load balancing Egyes részek futási ideje lehet, hogy nem azonos A futási idők eltérése csak ritkán becsülhetők előre Dinamikus szétosztás kellene Granualitás A szálak létrehozása, szinkronizálása akkor is idő, ha ezt eldugja a fordító. 2014.10.28. - 17-2014.10.28. - 18-3

Ütemezés schedule(static [, chunksize]) Statikus kiosztás Default: azonos darabok Round-robin (több darab, mint thread esetén) schedule(dynamic [, chunksize]) Dinamikus kiosztás Default chunksize = 1 schedule(guided [, chunksize]) Dinamikus, exponenciálisan csökken Granularitás #pragma omp parallel if (expression) Párhuzamosítás a feltétellel vezérelhető #pragma omp num_threads (expression) A szálak száma módosítható 2014.10.28. - 19-2014.10.28. - 20 - Data Environment Osztott változók - globális változók int sum = 0; #pragma omp parallel for for (int i=0; i<n; i++) sum += i; Privát Párh. blokk auto változói Függvények auto változói Explicit privát deklaráció esetén Tárolási attribútumok megadása private: Privát példány keletkezik, de nem másolódik le az eredeti adat Ugyanaz, mintha között lenne firstprivate: Kezdő érték lemásolódik lastprivate: Legutolsó érték visszamásolódik threadprivate: Perzisztens a párh. részek között (globális) 2014.10.28. - 21-2014.10.28. - 22 - Tárolási attribútumok pl. int i; #pragma omp parallel for private(i) for (i=0; i<n; i++) int idx=1; int x = 10; #pragma omp parallel for firsprivate(x) \ lastprivate(idx) for (i=0; i<n; i++) if (data[i]==x) idx = i; 2014.10.28. - 23 - Tárolási attribútumok pl./2 int data[100]; #pragma omp threadprivate(data) #pragma omp parallel for copyin(data) for (int i=0; i<n; i++) data[i]++; 2014.10.28. - 24-4

Redukció int sum = 0; #pragma omp parallel for reduction(+: sum) for (int i =0; i<n; j++) sum = sum+a[i]*b[i]; Csak skalár Másolat készül, a végén elvégzi a műveletet x op expr x++, ++x, x--, --x, op nem lehet túlterhelt Szinkronizációs mechanizmusok Single/Master execution #pragma omp single #pragma omp master Critical sections, Atomic updates #pragma omp critical [name] #pragma omp atomic update_statement Csak skalár, a redukciónál megismert formában. 2014.10.28. - 25-2014.10.28. - 26 - Szinkronizációs mech./2 Ordered #pragma omp ordered int vec[100]; #pragma omp parallel for ordered for (int i=0; i<100; i++) vec[i] = 2 * vec[i]; #pragma omp ordered printf( vec[i] = %d\n, vec[i]); Szinkronizációs mech./3 Barriers #pragma omp barrier Nowait #pragma omp sections nowait Flush #pragma omp flush (list) Reduction 2014.10.28. - 27-2014.10.28. - 28 - Kontroll funkciók omp_set_dynamic(int)/ omp_get_dynamic() omp_set_num_threads(int)/ omp_get_num_threads() OMP_NUM_THREADS env. omp_get_num_procs() omp_get_thread_num() omp_set_nested(int)/omp_get_nested() omp_in_parallel() omp_get_wtime() omp_init_lock(), omp_destroy_lock(), omp_set_lock(), omp_unset_lock(), omp_test_lock() Unified Parallel C (UPC) C99 kiterjesztése Közös memóriás modell, ami képes figyelembe venni a NUMA tulajdonságokat. Gyökerei 1999-re vezethetők vissza. Szupergépeken előszeretettel támogatják. upc-lang.org, upc.lbl.gov, upc.gwu.edu/tutorials/upc-sc05.pdf 2014.10.28. - 29-2014.10.28. - 30-5

UPC fontosabb jellemzői Explicit párhuzamos végrehajtási modell Teljesen független szálak (thread!= OS thread) Minden szálon függetlenül teljesül a C specifikáció (sok main). Particionált globális címtér (PGAS) megosztott (shared) adat, privát adat Skalár mindig p0-ban, tömb szétosztva Szinkronizációs primitívek Runtime könyvtár scatter,gathetr, reductions, exchange,.. UPC kulcsszavak MYTHREAD, THREADS shared, realaxed, strict, upc_barrier, upc_notify, upc_wait upc_forall, upc_blokcsizeof, upc_elementsizeof, upc_localsizeof, UPC_MAXB_LOCK_SIZE upc_fence, 2014.10.28. - 31-2014.10.28. - 32 - Memória modellek Process/Thread Címtér Message Passing Shared Memory PGAS MPI OpenMP UPC Particionált globális címtér A shared tömb változók elemei elosztottan helyezkednek el a memóriában valamelyik szálhoz rendelten (affinitás). A szálhoz közelebb levő adaton hatékonyabban dolgozhat egy-egy algoritmus. shared int a[100]; // ciklikusan eloszlik upc_forall(int i = 0; i < 100; i++; &a[i]) // az adott ciklus csak ott fut, ahol az adat van 2014.10.28. 33 2014.10.28. - 34 - Affinitás és blokkméret shared [block-size] type array[n]; affinity = (i/block-size)%threads shared [3] int A[4][THREADS]; Thf: THREADS = 4 Thread 0 Thread 1 Thread 2 Thread 3 PI példa shared long hits[threads]; // számlálók. upc_forall (i=0; i < my_trials; i++; continue) hits[mythread] += isinside(); upc_barrier; // bevár minden szálat A[0][0] A[0][1] A[0][2] A[3][0] A[3][1] A[3][2] A[0][3] A[1][0] A[1][1] A[3][3] A[1][2] A[1][3] A[2][0] A[2][1] A[2][2] A[2][3] if (MYTHREAD == 0) // összegzés for (i = 1; i < THREADS; i++) hits[0] += hits[i]; UPC Tutorial November 14, 2005 35 2014.10.28. - 36-6

Feladat A laborgyakorlaton 2 részfeladatot kell megoldani, és mindkét megoldást fel kell tölteni a portálra (1. párh. feladat) a) OpenMP segítségével párhuzamosítani kell a A részecske.c feladatot. b) Készíteni kell egy Gauss-eliminációval működő, OpenMP-vel párhuzamosított lineáris egyenletrendszer megoldó függvényt. a) feladat Diff. egyenlet megoldás párhuzamosítása reszecske.c: egy váz a Fokker-Planck egyenlet megoldásához ezt kell párhuzamoítani OpenMP-vel segédanyagok: ~szebi/gridoo/reszecske ~szebi/gridoo/pi computing.llnl.gov/tutorials/openmp Beadandó (feltöltendő, 4. parh. feladat): források: *.c Makefile rövid leírás: pdf, v. txt 2014.10.28. - 37-2014.10.28. - 38 - b) feladat Ax=b lineáris egyenletrendszer megoldásának párhuzamosítása dsolve.c: egyenl. megoldás Gauss-eliminációval. A kód célja az algoritmus bemutatása. Feladat egy új párhuzamos algoritmus létrehozása. Nem kötelező használni a meglevő kódot! Az interfész is változhat. (BLAS hívások csak a tesztprogramban maradhatnak!) További feladat egy tesztprogram írása ami indítási paraméterként vegye át a probléma méretét! b) Feladat (folyt.) Véletlenszámokkal töltse fel az A mátrixot és a b vektort, majd végezze el az egyenlet megoldását! Ellenőrzésként számítsa ki az y =Ax-b vektor l 2 normáját! Kellően kicsi eredményt kell kapni. segédanyagok: ~szebi/gridoo/gauss/dsolve.c,gauss_test.c,makefile ~szebi/gridoo/pi mathworld.wolfram.com/gaussianelimination.html SpeedUp számításánál a soros futási időt ne az egyszálas változaton mérje! 2014.10.28. - 39-2014.10.28. - 40 - b) Feladat (folyt.2) Beadandó (feltöltendő, 1. parh. feladat): források: *.c Makefile rövid leírás: pdf, v. txt mérési eredmények (SpeedUp) tick mérhető (100Hz) Mivel a para nevű gép virtuális gép nem igazán alkalmas mérésekre, ezért más környezetben pl. az ural2-n is érdemes mérni. 2014.10.28. - 41-7