OpenMP Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ OpenMP p. 1
Αρχιτεκτονικές Κατανεµηµένης Μνήµης Node Node L2 Memory L2 Memory Network OpenMP p. 2
Αρχιτεκτονικές Μοιραζόµενης Μνήµης CPU CPU L2... L2 Memory OpenMP p. 3
Αρχιτεκτονικές Μοιραζόµενης Μνήµης... LOAD X... STORE Y... CPU CPU... STORE X... LOAD Y... L2... L2 Memory OpenMP p. 3
Προγραµµατισµός σε Μοιραζόµενη Μνήµη void thread1(int *shared var) { int i; void thread2(int *shared var) { int i; for (i=0; i<loops; i++) *shared var = 7; for (i=0; i<loops; i++) *shared var += 7; int main(){ int shared var = 13; CREATE THREAD(thread1,shared var) CREATE THREAD(thread2,shared var) WAIT THREADS(thread1,thread2) printf("shared_var=%d\n", shared var); return 0; OpenMP p. 4
Προγραµµατισµός σε Μοιραζόµενη Μνήµη void thread1(int *shared var) { int i; void thread2(int *shared var) { int i; for (i=0; i<loops; i++) *shared var = 7; for (i=0; i<loops; i++) *shared var += 7; kkourt@twin3: /src/tests$ for i in $(seq 10); do./test1 ; done shared var=353891 shared var=360660 shared var=362683 shared var=360688 shared var=356124 shared var=321159 shared var=357552 shared var=-458739 shared var=355585 shared var=361871 OpenMP p. 4
Posix Threads Χαµηλού επιπέδου διεπαφή για το χειρισµό νηµάτων. Παραδείγµατα Συναρτήσεων: pthread create() pthread mutex {lock,unlock() pthread cond {wait,signal() pthread barrier wait() εν µπορεί εύκολα να χρησιµοποιηθεί για την παραλληλοποίηση σειριακών εφαρµογών. εν είναι αρκετά απλή για να χρησιµοποιηθεί από επιστήµονες, που θέλουν να παραλληλοποιήσουν τις εφαρµογές τους. OpenMP p. 5
OpenMP Πρότυπο για προγραµµατισµό σε µοιραζόµενη µνήµη. Ορίζει συγκεκριµένη διεπαφή(api) και όχι υλοποίηση Ο παραλληλισµός δηλώνεται ρητώς(explicitly) από τον προγραµµατιστή Γλώσσες: C/C++, Fortran MP = MultiProcessor Τα προγράµµατα του OpenMP: Mπορούν να µεταφρασθούν από µεταγλωττιστή που δεν το υποστηρίζεi. Μπορούν να εκτελεσθούν σειριακά. Εφαρµόζεται κυρίως σε εφαρµογές µε µεγάλους πίνακες. OpenMP p. 6
Μοντέλο Εκτέλεσης Worker Threads Parallel Regions Main Thread Synchronization OpenMP p. 7
Μοντέλο εδοµένων Private Memory Private Variables P0 P1 P2 P3 T0 T1 T2 T3 Threads Shared Memory Shared Variables OpenMP p. 8
Μοντέλο εδοµένων Private Memory Οι αλλαγές στα αντικείµενα που βρίσκονται στην κοινή µνήµη δεν γίνονται (γενικά) αντιλυπτά στο σύνολο των νηµάτων. (volatile, flush) Private Variables P0 P1 P2 P3 T0 T1 T2 T3 Threads Shared Memory Shared Variables OpenMP p. 8
Αρχιτεκτονική Application User Directive Compiler Enviroment Runtime Library Operating System Thread Support OpenMP p. 9
Βασικές Έννοιες Παράλληλη Περιοχή(Parallel Region): Κώδικας που εκτελείται από πολλαπλά νήµατα. Κατανοµή Εργασίας(Work Sharing): Η διαδικασία κατά την οποία κατανήµεται η εργασία στα νήµατα σε µια παράλληλη περιοχή. Οδηγία Μεταγλωττιστή(Compiler Directive): Η διεπαφή για την χρήση του OpenMP σε προγράµµατα. ΓιατηνC: #pragma omp <directive> <clauses> Construct: #pragma omp... <C statement> OpenMP p. 10
Παράλληλες Περιοχές directive: #pragma omp parallel o Αριθµός των νηµάτων καθορίζεται: Από το num threads clause Μετηχρήσητης omp set num threads() Με τη µεταβλητή περιβάλλοντος OMP NUM THREADS (Χρόνος Εκτέλεσης) Υπονοείται barrier στο τέλος της περιοχής. (Το barrier υπονοεί flush). OpenMP p. 11
Hello World! #include <omp.h> #include <stdio.h> int main() { #pragma omp parrallel printf("hello world! (thread_id: %d)\n", omp get thread num()); return 0; OpenMP p. 12
Κατανοµή Εργασίας directives: #pragma omp for #pragma omp sections #pragma omp single Τα directives για την κατανοµή εργασίας, περιέχονται σε µία παράλληλη περιοχή. εν δηµιουργούνται νέα νήµατα εν υπονοείται barrier στην είσοδο Υπονοείται barrier στην έξοδο (εκτός αν υπάρχει nowait) OpenMP p. 13
#pragma omp for Χρησιµοποιείται για την κατανοµή των επαναλήψεων ενός for loop στα νήµατα. Τοloopθαπρέπειναείναισεκανονικήµορφή.(Θαπρέπει να µπορούν να υπολογιστούν οι επαναλήψεις στην είσοδο τουloop). Σχετικά Clauses: schedule: Ορίζει πως κατανέµονται οι επαναλήψεις στα νήµατα(static, dynamic, guided, runtime). OpenMP p. 14
#pragma omp for: Παράδειγµα #pragma omp parallel { #pragma omp for for (i=0; i<n; i++) b[i] = (a[i]+a[i 1])/2.0; #pragma omp for for (i=0; i<n; i++) d[i] = 1.0/c[i]; OpenMP p. 15
#pragma omp for: Παράδειγµα #pragma omp parallel { #pragma omp for for (i=0; i<n; i++) b[i] = (a[i]+a[i 1])/2.0; i is considered private for the duration of the loop. #pragma omp for for (i=0; i<n; i++) d[i] = 1.0/c[i]; All other objects (a,b,c,d) are shared by default OpenMP p. 15
#pragma omp for: Παράδειγµα(2) #pragma omp parallel { #pragma omp for for (i=2; i<10; i++) factorial[i] = i*factorial[i 1] OpenMP p. 16
#pragma omp for: Παράδειγµα(2) #pragma omp parallel { #pragma omp for for (i=2; i<10; i++) factorial[i] = i*factorial[i 1] Εξάρτηση εδοµένων µεταξύ επαναλήψεων! OpenMP p. 16
#pragma omp for: Παράδειγµα(3) int i, temp; #pragma omp parallel for for (i=0; i<100; i++){ temp = array[i]; array[i] = do something(temp); OpenMP p. 17
#pragma omp for: Παράδειγµα(3) int i; #pragma omp parallel for for (i=0; i<100; i++){ int temp = array[i]; // private array[i] = do something(temp); OpenMP p. 17
#pragma omp {sections,single #pragma omp sections: Ορίζει µία η περισσότερες περιοχές που κατανέµονται µεταξύ των νηµάτων. #pragma omp single: Ορίζειµιαπεριοχή,ηοποίαθαεκτελεσθείµόνοαπόένα νήµα(όχι απαραίτητα το master). OpenMP p. 18
#pragma omp sections: Παράδειγµα #pragma omp parallel { #pragma omp sections { #pragma omp section do work(); #pragma omp section do other work(); OpenMP p. 19
#pragma omp single: Παράδειγµα #pragma omp parallel { #pragma single printf("starting...: "); do work1(); #pragma single printf("work1 done, "); do work2(); #pragma single printf("work2 done. Finished\n"); OpenMP p. 20
Συντοµέυσεις #pragma omp parallel #pragma omp for for (...) #pragma omp parallel #pragma omp sections for (...) #pragma omp parallel for for (...) #pragma omp parallel sections for (...) OpenMP p. 21
Constructs Συγχρονισµού #pragma omp barrier: Συγχρονισµός νηµάτων #pragma omp master: Κώδικας που εκτελείται µόνο από το κύριο νήµα #pragma omp critical: Κώδικας που δεν εκτελείται παράλληλα #pragma omp atomic: Ατοµική λειτουργία σε θέση µνήµης(++,,+=,...) #pragma omp flush: Επιβολή συνεπής εικόνας των µοιραζόµενων αντικειµένων. #pragma omp ordered: Επιβολή σειριακής εκτέλεσης βρόχου for OpenMP p. 22
#pragma omp barrier: Παράδειγµα #pragma omp parallel { #pragma omp barrier #pragma omp master gettimeofday(start,(struct timezone*)null); work(); #pragma omp barrier #pragma omp master { gettimeofday(finish,(struct timezone*)null); print stats(start,finish); OpenMP p. 23
#pragma omp critical: Παράδειγµα #pragma omp parallel shared(x, y) private(x next, y next) { #pragma omp critical (xaxis) x next=dequeue(x); work(x next); #pragma omp critical (yaxis) y next=dequeue(y); work(y next); OpenMP p. 24
#pragma omp atomic: Παράδειγµα #pragma omp parallel for shared(x, y, index, n) for(i=0;i<n;i++){ #pragma omp atomic x[index[i]] += work1(i); y[i]+=work2(i); OpenMP p. 25
#pragma omp ordered: Παράδειγµα #pragma omp parallel { #pragma omp for for(i=0;i<n;i++) a[i]=compute(i); #pragma omp for ordered for(i=0;i<n;i++){ #pragma omp ordered printf("a[%d]=%d\n",i,a[i]); OpenMP p. 26
Κλάσεις Ιδιωτικών Μεταβλητών private: Η µεταβλητή είναι ιδωτική για κάθε νήµα. lastprivate: private + Η τιµή του αντικειµένου τελικά πέρνει την τιµή πουθαείχεαντοπρόγραµµαήτανσειριακό(πχ.τηντιµή από την τελευταία επανάληψη). firstprivate: private +Ητιµήτουαντικειµένουγιακάθενήµα αρχικοποιείται στην τιµή που είχε πριν την έναρξη της παράλληλης περιοχής. OpenMP p. 27
#pragma omp ordered: Παράδειγµα a = 10; #pragma omp parallel { #pragma omp for private(i) firstprivate(a) lastprivate(b) for (i=0; i<n; i++){ b = a + i; c = b; OpenMP p. 28
Reduction Αναφέρεται σε εντολές της µορφής: x = x <op> expr, <op> = +,*,&&,... Κάθε µεταβλητή µπορεί να ανήκει το πολύ σε ένα reduction clause. Για κάθε µεταβλητή δηµιουργείται αντίστοιχη τοπική µεταβλητή σε κάθε νήµα και αρχικοποιείται ανάλογα µε τελεστή op. Παράδειγµα: #pragma omp parallel for reduction(+:sum) for(i=1;i<n;i++){ sum=sum+a(i); OpenMP p. 29
Βιβλιοθήκη Χρόνου Εκτέλεσης Περιβάλλον Εκτέλεσης(runtime enviroment): omp set num threads() omp get thread num() omp set dynamic() Συγχρονισµός µε κλειδώµατα(locking) omp init lock() omp set lock() omp test lock() Χρονοµέτρηση: omp get wtime() omp get wtick() OpenMP p. 30
Μεταβλητές Συστήµατος ροµολόγηση: OMP SCHEDULE=static OMP SCHEDULE=static,100 υναµική πολυνηµατική εκτέλεση: OMP DYNAMIC=TRUE Πλήθος νηµάτων: OMP NUM THREADS=2 OpenMP p. 31
Υβριδικές Αρχιτεκτονικές Node Node L2... L2 Memory... L2... L2 Memory Network OpenMP p. 32
Προγραµµατισµός µε βάση το Υβριδικό Μοντέλο OpenMP στο Εσωτερικό του Κόµβου. MPI για την επικοινωνία µεταξύ των κόµβων. Το µοντέλο εξαρτάτε από την πολυνηµατική υποστήριξη της βιβλιοθήκης ανταλλαγής µηνυµάτων: single(mpi THREAD SINGLE) masteronly funneled(mpi THREAD FUNNELED) serialized(mpi THREAD SERIALIZED) multiple(mpi THREAD MULTIPLE) OpenMP p. 33