OpenMP - - PowerPoint PPT Presentation

openmp
SMART_READER_LITE
LIVE PREVIEW

OpenMP - - PowerPoint PPT Presentation

OpenMP


slide-1
SLIDE 1

OpenMP

Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης

Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ

OpenMP – p. 1

slide-2
SLIDE 2

Αρχιτεκτονικές Κατανεµηµένης Μνήµης

Memory Memory L2 Node L2 Node Network

OpenMP – p. 2

slide-3
SLIDE 3

Αρχιτεκτονικές Μοιραζόµενης Μνήµης

... L2 Memory L2 CPU CPU

OpenMP – p. 3

slide-4
SLIDE 4

Αρχιτεκτονικές Μοιραζόµενης Μνήµης

... L2 Memory L2 CPU CPU

... LOAD X ... STORE Y ... ... STORE X ... LOAD Y ...

OpenMP – p. 3

slide-5
SLIDE 5

Προγραµµατισµός σε Μοιραζόµενη Μνήµη

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

slide-6
SLIDE 6

Προγραµµατισµός σε Μοιραζόµενη Μνήµη

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

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

slide-7
SLIDE 7

Posix Threads

■ Χαµηλού επιπέδου διεπαφή για το χειρισµό νηµάτων. ■ Παραδείγµατα Συναρτήσεων: ◆ pthread create() ◆ pthread mutex {lock,unlock}() ◆ pthread cond {wait,signal}() ◆ pthread barrier wait() ■ ∆εν µπορεί εύκολα να χρησιµοποιηθεί για την

παραλληλοποίηση σειριακών εφαρµογών.

■ ∆εν είναι αρκετά απλή για να χρησιµοποιηθεί από

επιστήµονες, που θέλουν να παραλληλοποιήσουν τις εφαρµογές τους.

OpenMP – p. 5

slide-8
SLIDE 8

OpenMP

■ Πρότυπο για προγραµµατισµό σε µοιραζόµενη µνήµη. ■ Ορίζει συγκεκριµένη διεπαφή (API) και όχι υλοποίηση ■ Ο παραλληλισµός δηλώνεται ρητώς (explicitly) από τον

προγραµµατιστή

■ Γλώσσες: C/C++, Fortran ■ MP = MultiProcessor ■ Τα προγράµµατα του OpenMP: ◆ Mπορούν να µεταφρασθούν από µεταγλωττιστή που

δεν το υποστηρίζεi.

◆ Μπορούν να εκτελεσθούν σειριακά. ■ Εφαρµόζεται κυρίως σε εφαρµογές µε µεγάλους πίνακες.

OpenMP – p. 6

slide-9
SLIDE 9

Μοντέλο Εκτέλεσης

Main Thread Worker Threads Synchronization Parallel Regions

OpenMP – p. 7

slide-10
SLIDE 10

Μοντέλο ∆εδοµένων

P3 P2 P0 P1 T0 T2 T3 T1 Shared Memory Private Memory Private Variables Shared Variables Threads

OpenMP – p. 8

slide-11
SLIDE 11

Μοντέλο ∆εδοµένων

P3 P2 P0 P1 T0 T2 T3 T1 Shared Memory Private Memory Private Variables Shared Variables Threads

Οι αλλαγές στα αντικείµενα που βρίσκονται στην κοινή µνήµη δεν γίνονται (γενικά) αντιλυπτά στο σύνολο των νηµάτων. (volatile, flush)

OpenMP – p. 8

slide-12
SLIDE 12

Αρχιτεκτονική

Directive Compiler Operating System Thread Support Application User Enviroment Runtime Library

OpenMP – p. 9

slide-13
SLIDE 13

Βασικές Έννοιες

■ Παράλληλη Περιοχή (Parallel Region):

Κώδικας που εκτελείται από πολλαπλά νήµατα.

■ Κατανοµή Εργασίας (Work Sharing):

Η διαδικασία κατά την οποία κατανήµεται η εργασία στα νήµατα σε µια παράλληλη περιοχή.

■ Οδηγία Μεταγλωττιστή (Compiler Directive):

Η διεπαφή για την χρήση του OpenMP σε προγράµµατα. Για την C: #pragma omp <directive> <clauses>

■ Construct:

#pragma omp ... <C statement>

OpenMP – p. 10

slide-14
SLIDE 14

Παράλληλες Περιοχές

■ directive: #pragma omp parallel ■ o Αριθµός των νηµάτων καθορίζεται: ◆ Από το num threads clause ◆ Με τη χρήση της omp set num threads() ◆ Με τη µεταβλητή περιβάλλοντος OMP NUM THREADS

(Χρόνος Εκτέλεσης)

■ Υπονοείται barrier στο τέλος της περιοχής.

(Το barrier υπονοεί flush).

OpenMP – p. 11

slide-15
SLIDE 15

Hello World!

#include <omp.h> #include <stdio.h>

int main()

{ #pragma omp parrallel

printf("Hello world! (thread_id: %d)\n",

  • mp get thread num());

return 0;

}

OpenMP – p. 12

slide-16
SLIDE 16

Κατανοµή Εργασίας

■ directives: ◆ #pragma omp for ◆ #pragma omp sections ◆ #pragma omp single ■ Τα directives για την κατανοµή εργασίας, περιέχονται σε µία

παράλληλη περιοχή.

■ ∆εν δηµιουργούνται νέα νήµατα ■ ∆εν υπονοείται barrier στην είσοδο ■ Υπονοείται barrier στην έξοδο

(εκτός αν υπάρχει nowait)

OpenMP – p. 13

slide-17
SLIDE 17

#pragma omp for

■ Χρησιµοποιείται για την κατανοµή των επαναλήψεων ενός

for loop στα νήµατα.

■ Το loop θα πρέπει να είναι σε κανονική µορφή. (Θα πρέπει

να µπορούν να υπολογιστούν οι επαναλήψεις στην είσοδο του loop).

■ Σχετικά Clauses: ◆ schedule: Ορίζει πως κατανέµονται οι επαναλήψεις

στα νήµατα (static, dynamic, guided, runtime).

OpenMP – p. 14

slide-18
SLIDE 18

#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

slide-19
SLIDE 19

#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];

}

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

slide-20
SLIDE 20

#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

slide-21
SLIDE 21

#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

slide-22
SLIDE 22

#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

slide-23
SLIDE 23

#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

slide-24
SLIDE 24

#pragma omp {sections,single}

■ #pragma omp sections:

Ορίζει µία η περισσότερες περιοχές που κατανέµονται µεταξύ των νηµάτων.

■ #pragma omp single:

Ορίζει µια περιοχή, η οποία θα εκτελεσθεί µόνο από ένα νήµα (όχι απαραίτητα το master).

OpenMP – p. 18

slide-25
SLIDE 25

#pragma omp sections: Παράδειγµα

#pragma omp parallel { #pragma omp sections { #pragma omp section

do work();

#pragma omp section

do other work();

} }

OpenMP – p. 19

slide-26
SLIDE 26

#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

slide-27
SLIDE 27

Συντοµέυσεις

#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

slide-28
SLIDE 28

Constructs Συγχρονισµού

■ #pragma omp barrier:

Συγχρονισµός νηµάτων

■ #pragma omp master:

Κώδικας που εκτελείται µόνο από το κύριο νήµα

■ #pragma omp critical:

Κώδικας που δεν εκτελείται παράλληλα

■ #pragma omp atomic:

Ατοµική λειτουργία σε θέση µνήµης (++,–,+=,...)

■ #pragma omp flush:

Επιβολή συνεπής εικόνας των µοιραζόµενων αντικειµένων.

■ #pragma omp ordered:

Επιβολή σειριακής εκτέλεσης βρόχου for

OpenMP – p. 22

slide-29
SLIDE 29

#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

slide-30
SLIDE 30

#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

slide-31
SLIDE 31

#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

slide-32
SLIDE 32

#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

slide-33
SLIDE 33

Κλάσεις Ιδιωτικών Μεταβλητών

■ private:

Η µεταβλητή είναι ιδωτική για κάθε νήµα.

■ lastprivate:

private + Η τιµή του αντικειµένου τελικά πέρνει την τιµή που θα είχε αν το πρόγραµµα ήταν σειριακό (πχ. την τιµή από την τελευταία επανάληψη).

■ firstprivate:

private + Η τιµή του αντικειµένου για κάθε νήµα αρχικοποιείται στην τιµή που είχε πριν την έναρξη της παράλληλης περιοχής.

OpenMP – p. 27

slide-34
SLIDE 34

#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

slide-35
SLIDE 35

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

slide-36
SLIDE 36

Βιβλιοθήκη Χρόνου Εκτέλεσης

■ Περιβάλλον Εκτέλεσης (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

slide-37
SLIDE 37

Μεταβλητές Συστήµατος

■ ∆ροµολόγηση: ◆ OMP SCHEDULE=static ◆ OMP SCHEDULE=static,100 ■ ∆υναµική πολυνηµατική εκτέλεση: ◆ OMP DYNAMIC=TRUE ■ Πλήθος νηµάτων: ◆ OMP NUM THREADS=2

OpenMP – p. 31

slide-38
SLIDE 38

Υβριδικές Αρχιτεκτονικές

L2 L2 Memory Node ... L2 L2 Memory Node ... Network ...

OpenMP – p. 32

slide-39
SLIDE 39

Προγραµµατισµός µε βάση το Υβριδικό Μοντέλο

■ OpenMP στο Εσωτερικό του Κόµβου. ■ MPI για την επικοινωνία µεταξύ των κόµβων.

Το µοντέλο εξαρτάτε από την πολυνηµατική υποστήριξη της βιβλιοθήκης ανταλλαγής µηνυµάτων:

■ single (MPI THREAD SINGLE) ■ masteronly ■ funneled (MPI THREAD FUNNELED) ■ serialized (MPI THREAD SERIALIZED) ■ multiple (MPI THREAD MULTIPLE)

OpenMP – p. 33