OpenMP Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ OpenMP – p. 1
Αρχιτεκτονικές Κατανεµηµένης Μνήµης Node Node Memory Memory L2 L2 Network OpenMP – p. 2
Αρχιτεκτονικές Μοιραζόµενης Μνήµης CPU CPU ... L2 L2 Memory OpenMP – p. 3
Αρχιτεκτονικές Μοιραζόµενης Μνήµης ... ... LOAD X STORE X CPU CPU ... ... STORE Y LOAD Y ... ... ... L2 L2 Memory OpenMP – p. 3
Προγραµµατισµός σε Μοιραζόµενη Μνήµη void thread1( int *shared var) { void thread2( int *shared var) { int i; int i; for (i=0; i < LOOPS; i++) for (i=0; i < LOOPS; i++) *shared var − = 7; *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) { void thread2( int *shared var) { int i; int i; for (i=0; i < LOOPS; i++) for (i=0; i < LOOPS; i++) *shared var − = 7; *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
Μοντέλο Εκτέλεσης Parallel Regions Worker Threads Synchronization Main Thread 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 Οι αλλαγές στα αντικείµενα που βρίσκονται στην Private Variables κοινή µνήµη δεν γίνονται (γενικά) αντιλυπτά στο σύνολο των νηµάτων. ( volatile , flush ) P0 P1 P2 P3 T0 T1 T2 T3 Threads Shared Memory Shared Variables OpenMP – p. 8
Αρχιτεκτονική Application User Directive Enviroment Compiler 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 : Παράδειγµα i is considered private for the du- # pragma omp parallel ration of the loop. { # 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]; } 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 parallel #pragma omp for #pragma omp sections for (...) for (...) #pragma omp parallel for #pragma omp parallel sections for (...) 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
Recommend
More recommend