OpenMP
Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης
Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ
OpenMP – p. 1
OpenMP - - PowerPoint PPT Presentation
OpenMP
Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ
OpenMP – p. 1
Memory Memory L2 Node L2 Node Network
OpenMP – p. 2
... L2 Memory L2 CPU CPU
OpenMP – p. 3
... L2 Memory L2 CPU CPU
... LOAD X ... STORE Y ... ... STORE X ... LOAD Y ...
OpenMP – p. 3
void thread1(int *shared var) { int i; for (i=0; i<LOOPS; i++) *shared var −= 7;
void thread2(int *shared var) { int i; 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; for (i=0; i<LOOPS; i++) *shared var −= 7;
void thread2(int *shared var) { int i; for (i=0; i<LOOPS; i++) *shared var += 7;
kkourt@twin3:˜/src/tests$ for i in $(seq 10); do ./test1 ; done
OpenMP – p. 4
■ Χαµηλού επιπέδου διεπαφή για το χειρισµό νηµάτων. ■ Παραδείγµατα Συναρτήσεων: ◆ pthread create() ◆ pthread mutex {lock,unlock}() ◆ pthread cond {wait,signal}() ◆ pthread barrier wait() ■ ∆εν µπορεί εύκολα να χρησιµοποιηθεί για την
■ ∆εν είναι αρκετά απλή για να χρησιµοποιηθεί από
OpenMP – p. 5
■ Πρότυπο για προγραµµατισµό σε µοιραζόµενη µνήµη. ■ Ορίζει συγκεκριµένη διεπαφή (API) και όχι υλοποίηση ■ Ο παραλληλισµός δηλώνεται ρητώς (explicitly) από τον
■ Γλώσσες: C/C++, Fortran ■ MP = MultiProcessor ■ Τα προγράµµατα του OpenMP: ◆ Mπορούν να µεταφρασθούν από µεταγλωττιστή που
◆ Μπορούν να εκτελεσθούν σειριακά. ■ Εφαρµόζεται κυρίως σε εφαρµογές µε µεγάλους πίνακες.
OpenMP – p. 6
Main Thread Worker Threads Synchronization Parallel Regions
OpenMP – p. 7
P3 P2 P0 P1 T0 T2 T3 T1 Shared Memory Private Memory Private Variables Shared Variables Threads
OpenMP – p. 8
P3 P2 P0 P1 T0 T2 T3 T1 Shared Memory Private Memory Private Variables Shared Variables Threads
Οι αλλαγές στα αντικείµενα που βρίσκονται στην κοινή µνήµη δεν γίνονται (γενικά) αντιλυπτά στο σύνολο των νηµάτων. (volatile, flush)
OpenMP – p. 8
Directive Compiler Operating System Thread Support Application User Enviroment Runtime Library
OpenMP – p. 9
■ Παράλληλη Περιοχή (Parallel Region):
■ Κατανοµή Εργασίας (Work Sharing):
■ Οδηγία Μεταγλωττιστή (Compiler Directive):
■ Construct:
OpenMP – p. 10
■ directive: #pragma omp parallel ■ o Αριθµός των νηµάτων καθορίζεται: ◆ Από το num threads clause ◆ Με τη χρήση της omp set num threads() ◆ Με τη µεταβλητή περιβάλλοντος OMP NUM THREADS
■ Υπονοείται barrier στο τέλος της περιοχής.
OpenMP – p. 11
int main()
printf("Hello world! (thread_id: %d)\n",
return 0;
OpenMP – p. 12
■ directives: ◆ #pragma omp for ◆ #pragma omp sections ◆ #pragma omp single ■ Τα directives για την κατανοµή εργασίας, περιέχονται σε µία
■ ∆εν δηµιουργούνται νέα νήµατα ■ ∆εν υπονοείται barrier στην είσοδο ■ Υπονοείται barrier στην έξοδο
OpenMP – p. 13
■ Χρησιµοποιείται για την κατανοµή των επαναλήψεων ενός
■ Το loop θα πρέπει να είναι σε κανονική µορφή. (Θα πρέπει
■ Σχετικά Clauses: ◆ schedule: Ορίζει πως κατανέµονται οι επαναλήψεις
OpenMP – p. 14
for (i=0; i<n; i++) b[i] = (a[i]+a[i−1])/2.0;
for (i=0; i<n; i++) d[i] = 1.0/c[i];
OpenMP – p. 15
for (i=0; i<n; i++) b[i] = (a[i]+a[i−1])/2.0;
for (i=0; i<n; i++) d[i] = 1.0/c[i];
i is considered private for the du- ration of the loop. All other objects (a,b,c,d) are shared by default
OpenMP – p. 15
for (i=2; i<10; i++) factorial[i] = i*factorial[i−1]
OpenMP – p. 16
for (i=2; i<10; i++) factorial[i] = i*factorial[i−1]
OpenMP – p. 16
int i, temp;
for (i=0; i<100; i++){ temp = array[i]; array[i] = do something(temp);
OpenMP – p. 17
int i;
for (i=0; i<100; i++){ int temp = array[i]; // private array[i] = do something(temp);
OpenMP – p. 17
■ #pragma omp sections:
■ #pragma omp single:
OpenMP – p. 18
do work();
do other work();
OpenMP – p. 19
printf("starting . . .: "); do work1();
printf("work1 done, "); do work2();
printf("work2 done. Finished\n");
OpenMP – p. 20
#pragma omp parallel #pragma omp for for (...) #pragma omp parallel for for (...) #pragma omp parallel #pragma omp sections for (...) #pragma omp parallel sections for (...)
OpenMP – p. 21
■ #pragma omp barrier:
■ #pragma omp master:
■ #pragma omp critical:
■ #pragma omp atomic:
■ #pragma omp flush:
■ #pragma omp ordered:
OpenMP – p. 22
gettimeofday(start,(struct timezone*)NULL); work();
gettimeofday(finish,(struct timezone*)NULL); print stats(start,finish);
OpenMP – p. 23
x next=dequeue(x); work(x next);
y next=dequeue(y); work(y next);
OpenMP – p. 24
for(i=0;i<n;i++){
x[index[i]] += work1(i); y[i]+=work2(i);
OpenMP – p. 25
for(i=0;i<N;i++) a[i]=compute(i);
for(i=0;i<N;i++){
printf("a[%d]=%d\n",i,a[i]);
OpenMP – p. 26
■ private:
■ lastprivate:
■ firstprivate:
OpenMP – p. 27
a = 10;
for (i=0; i<n; i++){ b = a + i;
c = b;
OpenMP – p. 28
■ Αναφέρεται σε εντολές της µορφής:
■ Κάθε µεταβλητή µπορεί να ανήκει το πολύ σε ένα reduction
■ Για κάθε µεταβλητή δηµιουργείται αντίστοιχη τοπική
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
L2 L2 Memory Node ... L2 L2 Memory Node ... 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