Ε-85: Ειδικά Θέµατα Λογισµικού

Σχετικά έγγραφα
Περίληψη. Υπερυπολογιστές. Υπολογιστικά προβλήµατα. TOP 500 (Ιούνιος 2007) TOP 500 (Ιούνιος 2009) Ε-85: Ειδικά Θέµατα Λογισµικού

Ε-85: Ειδικά Θέµατα Λογισµικού

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

Προγραμματισμός με το OpenMP Β. Δημακόπουλος

Ε-85: Ειδικά Θέµατα Λογισµικού

Προγραµµατισµός Νηµάτων. Αρχικοποίηση µιας Φοράς pthread_once_t once_block = PTHREAD_ONCE_INIT; pthread_mutex_t mutex;

Μέρος IΙ: OpenMP Κεφάλαιο 4 (νέο βιβλίο)

2/4/2012 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (ΙΙ) OpenMP Β. Δημακόπουλος

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήµατα Παράλληλης Επεξεργασίας. OpenMP

OpenMP. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων. Αθήνα, Νοέµβριος /11/2004 Εισαγωγή στο OpenMP 1

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. OpenMP. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP

Επιστημονικοί Υπολογισμοί - Μέρος ΙΙΙ: Παράλληλοι Υπολογισμοί

OpenMP. Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ. OpenMP p.

EM 361: Παράλληλοι Υπολογισμοί

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

Ορολογία. Παράδειγµα 3. Εξισορρόπηση Εργασίας. Ε-85: Ειδικά Θέµατα Λογισµικού. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6

Ε-85: Ειδικά Θέµατα Λογισµικού

ΥΛΟΠΟΙΗΣΗ ΣΥΝΤΑΚΤΙΚΟΥ ΑΝΑΛΥΤΗ ΓΙΑ ΤΟΝ ΠΑΡΑΛΛΗΛΟΠΟΙΗΤΙΚΟ ΜΕΤΑΦΡΑΣΤΗ OMPI Η ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΕΞΕΙ ΙΚΕΥΣΗΣ. Υποβάλλεται στην

Κατανεμημένος και Παράλληλος Προγραμματισμός

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Υ07 Παράλληλα Συστήματα /3/2018 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (IΙ)

Δομημένος Προγραμματισμός

Ε-85: Ειδικά Θέµατα Λογισµικού

Λ10 Παράλληλος & Κατανεμημένος Προγραμματισμός 2009

Αποδοτική εκτέλεση προγραμμάτων OpenMP σε συστάδες Η/Υ

Κατανεμημένος και Παράλληλος Προγραμματισμός

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP (2 ο Μέρος)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Η/Υ (ΤΛ2007 )

Υλοποίηση cancellation στον παραλληλοποιητικό μεταφραστή OMPi. Εμμανουήλ Φελουτζή. με Α.Μ: 1579 ΔΙΠΛΩΜΑΤΟΣ

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Παράλληλη Επεξεργασία

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Ανάπτυξη και Σχεδίαση Λογισμικού

Παρουσίαση 5 ης Άσκησης:

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Εισαγωγή στον Προγραμματισμό

Προγραμματισμό για ΗΜΥ

Η γλώσσα προγραμματισμού C

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Παρουσίαση 5 ης Άσκησης:

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Συστημάτων

Αντικειµενοστρεφής Προγραµµατισµός

Κατανεμημένος και Παράλληλος Προγραμματισμός

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κατανεμημένος και. Ηλίας Κ. Σάββας Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

είκτες και Πίνακες (2)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Δομημένος Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών

Εισαγωγή στον Προγραμματισμό

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Δομημένος Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Μεθόδων Επίλυσης Προβλημάτων

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Ενότητα 13. Εισαγωγή στην Πληροφορική. Κεφάλαιο 13Α. Αρχεία. Χειµερινό Εξάµηνο ρ. Παναγιώτης Χατζηδούκας (Π..407/80) προγραµµατισµός

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Πληροφορική 2. Γλώσσες Προγραμματισμού

Επανάληψη για τις Τελικές εξετάσεις

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Προγραμματισμό

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Εισαγωγή στη Fortran. Μάθημα 3 ο. Ελευθερία Λιούκα

Η γλώσσα προγραμματισμού C

Διάλεξη 6: Δείκτες και Πίνακες

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Διάλεξη 5η: Εντολές Επανάληψης

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Transcript:

Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Εισαγωγή στο OpenMP» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 1

Πολυεπεξεργαστές Επεξεργαστές µε τεχνολογία Hyper-threading (SMT) Επεξεργαστές µε τεχνολογία Multi-Core E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 2

Λογισµικό Οι περισσότεροι συγγραφείς εφαρµογών αγνοούν τον παραλληλισµό εκτός ίσως από αδρά καταµερισµένο (βαρύ) πολυνηµατισµό για GUI s και λογισµικό συστήµατος Γιατί; Οι δυσκολίες συγγραφής παράλληλου software υπερνικούν τα πλεονεκτήµατα Τα πλεονεκτήµατα είναι ξεκάθαρα. Για να αυξηθεί ο όγκος του παράλληλου software πρέπει να ελαχιστοποιηθούν οι δυσκολίες. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 3

Υπολογισµός του π Ακολουθιακή Έκδοση static long num_steps; double step; int main () { int i; double x, pi, sum = 0.0; num_steps = 100000; step = 1.0/(double) num_steps; for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 4

Υπολογισµός του π Πολυνηµατική Έκδοση #include <pthread.h> #define NUM_THREADS 2 pthread_t thread[num_threads]; pthread_mutex_t UpdateMutex; static long num_steps; double step; double global_sum = 0.0; void *Pi (void *arg) { int i, start; double x, sum = 0.0; start = *(int *) arg; step = 1.0/(double) num_steps; for (i=start;i<= num_steps; i=i+num_threads){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pthread_mutex_lock (&UpdateMutex); global_sum += sum; pthread_mutex_unlock(&updatemutex); return 0; int main () { double pi; int i; num_steps = 100000; int Arg[NUM_THREADS]; for(i=0; i<num_threads; i++) threadarg[i] = i+1; pthread_mutex_init (&UpdateMutex, NULL); for (i=0; i<num_threads; i++) pthread_create(&thread[i], NULL, Pi,&Arg[i]); for (i=0; i<num_threads; i++) pthread_join(thread[i], NULL); pi = global_sum * step; return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 5

Υπολογισµόςτου π µε χρήση του OpenMP #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 int main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads); #pragma omp parallel for reduction(+:sum) private(x) for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6

Εισαγωγήστο OpenMP OpenMP: API για τη συγγραφήπολυνηµατικών εφαρµογών Σύνολο οδηγιών προς τον µεταγλωττιστή καισυναρτήσεων βιβλιοθήκης, διαθέσιµο στονπρογραµµατιστή παράλληλων συστηµάτων ιευκολύνει τη συγγραφή πολυνηµατικώνπρογραµµάτων σε Fortran, C and C++ Πρότυπο που συγκεντρώνει την εµπειρία αρκετών χρόνων σε προγραµµατισµό πολυεπεξεργαστικών συστηµάτων E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 7

OpenMP Μοντέλο προγραµµατισµού για παράλληλα συστήµατα Οδηγίες προς τον µεταγλωττιστή ώστε να παράγει κώδικα µε νήµατα Όλες οι µεγάλες εταιρίες το υποστηρίζουνή/και αποφασίζουν για την εξέλιξή του Intel, SUN, IBM, HP, SGI, Microsoft (Visual Studio 2005) GNU GCC 4.2 Ερευνητικοί compilers Omni (Ιαπωνία), NANOS (Ισπανία) OpenUH (ΗΠΑ), OMPi (Ελλάδα - UoI) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 8

ΠρογραµµατιστικόΜοντέλο Παραλληλισµός τύπου Fork-Join: To νήµα αρχηγός δηµιουργεί οµάδα νηµάτων σύµφωνα µε τις ανάγκες Ο παραλληλισµός προστίθεται βαθµιαία το ακολουθιακό πρόγραµµα εξελίσσεται σε παράλληλο πρόγραµµα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 9

ΤυπικήΧρήση Το OpenMP συνήθως χρησιµοποιείται για την παραλληλοποίηση loops: Βρες τα πιο χρονοβόρα loops. Μοίρασε τις επαναλήψεις µεταξύ νηµάτων. void main() { double Res[1000]; for (int i=0;i<1000;i++) { do_huge_comp(res[i]); Ακολουθιακό πρόγραµµα ιαίρεσεαυτό το loop µεταξύ πολλαπλών νηµάτων void main() { double Res[1000]; #pragma omp parallel for for (int i=0;i<1000;i++) { do_huge_comp(res[i]); Παράλληλο πρόγραµµα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 10

ΑλληλεπίδρασηΝηµάτων Πλεονέκτηµα: Απόκρυψη «λεπτοµερειών» από τον προγραµµατιστή Μειονέκτηµα: Απόκρυψη πολλών «λεπτοµερειών» από τον προγραµµατιστή µπορεί να βλάψει την επίδοση To OpenMP είναι µοντέλο κοινής µνήµης Τα νήµατα επικοινωνούν µέσω διαµοιραζόµενων µεταβλητών Ακούσια διαµοίραση δεδοµένων µπορεί να προκαλέσει races: race : Το αποτέλεσµα του προγράµµατος αλλάζει µε τυχαίο τρόπο αντα νήµατα εκτελεστούν µε διαφορετική σειρά Εξάλειψη races : Χρήση συγχρονισµού στα σηµεία που χρειάζεται Ο συγχρονισµός είναι «ακριβός», άρα: Αλλαγή της δοµής του προγράµµατος και της οργάνωσης των δεδοµένων ώστε να µειωθούν οι απαιτήσεις συγχρονισµού E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 11

ΣύνταξηΟδηγιών Οιπερισσότερες «εντολές» OpenMP είναι directives προς τον compiler ή pragmas. Για την C και C++, τα pragmas έχουν τη µορφή: #pragma omp construct [clause [clause] ] Για τη Fortran, τα directives έχουν µία από τις ακόλουθες µορφές: C$OMP construct [clause [clause] ]!$OMP construct [clause [clause] ] *$OMP construct [clause [clause] ] Αφού οι «εντολές» είναι directives και pragmas ένα πρόγραµµα OpenMP µπορεί να µεταγλωττιστεί από compilers που δεν υποστηρίζουν OpenMP οι τελευταίοι απλά αγνοούν τα directives / pragmas E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 12

οµηµένατµήµατα (blocks) Οι περισσότερες «εντολές» OpenMP εφαρµόζονται σε δοµηµένα τµήµατα (blocks) κώδικα. οµηµένο τµήµα: ένα τµήµα κώδικα µε ένα σηµείο εισόδου στηνκορυφή και ένα σηµείο εξόδου στο τέλος. Οι µόνες επιτρεπτέςδιακλαδώσεις είναι εντολές STOP της Fortran και exit() της C/C++. C$OMP PARALLEL 10 wrk(id) = garbage(id) res(id) = wrk(id)**2 if(conv(res(id)) goto 10 C$OMP END PARALLEL print *,id οµηµένο τµήµα C$OMP PARALLEL 10 wrk(id) = garbage(id) 30 res(id)=wrk(id)**2 if(conv(res(id))goto 20 go to 10 C$OMP END PARALLEL if(not_done) goto 30 20 print *, id Μη δοµηµένο τµήµα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 13

ΠαράλληλαΤµήµατα Νήµατα δηµιουργούνται στο OpenMP (στη C/C++) µε το pragma omp parallel Για παράδειγµα, για να δηµιουργηθεί ένα παράλληλο τµήµα µε 4 νήµατα: double A[1000]; omp_set_num_threads(4); #pragma omp parallel { int ID = omp_thread_num(); pooh(id,a); Κάθε νήµα εκτελεί για λογαριασµό του τον κώδικα µέσα στο δοµηµένο block του παράλληλου τµήµατος Κάθε νήµα καλεί την pooh(id) για ID = 0 έως 3 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 14

ΠαράλληλαΤµήµατα Κάθενήµα εκτελεί για λογαριασµό του τον ίδιο κώδικα Ένα µοναδικό αντίγραφο του Α µοιράζεται µεταξύ των νηµάτων Η εκτέλεση προχωρά µόνο όταν έχουν τελειώσει όλα τα νήµατα (barrier) double A[1000]; omp_set_num_threads(4); #pragma omp parallel { int ID = omp_thread_num(); pooh(id,a); printf( all done\n ); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 15

ΠολυνηµατικόΠρόγραµµα «Hello world» Γράψτεένα πολυνηµατικόπρόγραµµα στο οποίο κάθε νήµα τυπώνει ένα απλό νήµατα (π.χ. hello world ). Χρησιµοποιήστε 2 ξεχωριστές εντολές printfκαι το thread ID: int ID = omp_get_thread_num(); printf( hello(%d), ID); printf( world(%d), ID); Τι γίνεται όταν εκτελείται ταυτόχρονα I/O από πολλαπλά νήµατα; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 16

ΜερικέςΠρώτες Λεπτοµέρειες Dynamic mode (default): Ο αριθµός των νηµάτων που χρησιµοποιούνται για την εκτέλεση παράλληλων τµηµάτων µπορεί να διαφέρει µεταξύ διαφορετικών τµηµάτων Ο ορισµός του αριθµού των νηµάτων αφορά τον µέγιστο αριθµό νηµάτων και ενδεχοµένως η εκτέλεση να γίνει µε λιγότερα νήµατα Static mode: Ο αριθµός των νηµάτων είναι σταθερός και µάλιστα ακριβώς αυτός που καθορίζεται από τον προγραµµατιστή Το OpenMP υποστηρίζει εµφωλευµένα παράλληλα τµήµατα, όµως Ένας compiler ενδεχοµένως να επιλέξει να εκτελέσει σειριακά όλα τα επίπεδα µετά το 1ο E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 17

οµές ιαµοίρασης Έργου Το omp for κατανέµει τις επαναλήψεις ενός loop µεταξύ των νηµάτων µιας οµάδας #pragma omp parallel #pragma omp for for (I=0;I<N;I++){ ΝEAT_STUFF(I); Εξ ορισµού υπονοείται barrier στο τέλος του omp for Για να αφαιρεθεί το barrier χρησιµοποιούµε την παράµετρο nowait E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 18

Χρησιµότητα οµών ιαµοίρασης Ακολουθιακός κώδικας for(i=0;i<n;i++) { a[i] = a[i] + b[i]; Παράλληλο τµήµα OpenMP #pragma omp parallel { int id, i, Nthrds, istart, iend; id = omp_get_thread_num(); Nthrds = omp_get_num_threads(); istart = id * N / Nthrds; iend = (id+1) * N / Nthrds; for(i=istart;i<iend;i++) { a[i] = a[i] + b[i]; Παράλληλο τµήµα OpenMP µε omp for για διαµοίραση έργου #pragma omp parallel #pragma omp for schedule(static) for(i=0;i<n;i++) { a[i] = a[i] + b[i]; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 19

οµές ιαµοίρασης Έργου Ηδοµή διαµοίρασης έργου sections αναθέτει ένα διαφορετικό δοµηµένο block σε κάθε νήµα #pragma omp parallel #pragma omp sections { x_calculation(); #pragma omp section y_calculation(); #pragma omp section z_calculation(); Εξ ορισµού υπονοείται barrier στο τέλος του omp sections Για να αφαιρεθεί το barrier χρησιµοποιούµε την παράµετρο nowait E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 20

ΣυνδυασµοίΕντολών Συνδυασµόςτης Εντολής parallel µε δοµές διαµοίρασης έργου #pragma omp parallel for for (I=0;I<N;I++){ NEAT_STUFF(I); Υπάρχει και parallel sections E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 21

Υπολογισµόςτου π Πρόγραµµαπου χρησιµοποιεί αριθµητική ολοκλήρωση για τον υπολογισµό προσέγγισης του π Παραλληλοποίηση τους προγράµµατος χρησιµοποιώντας OpenMP. Υπάρχουν εναλλακτικές επιλογές: Σαν πρόγραµµα SPMD µε χρήση παράλληλου τµήµατος µόνο Με χρήση δοµής διαµοίρασης έργου ιασφάλιση ότι το ένα νήµα δεν θα γράφει πάνω στις µεταβλητές του άλλου E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 22

Πρόγραµµαπ Ακολουθιακή Έκδοση static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 23

Έκδοσηµε Παράλληλο Τµήµα (SPMD) #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum[num_threads]; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads) #pragma omp parallel { int i; double x; int id; id = omp_get_thread_num(); for (i=id, sum[id]=0.0;i< num_steps; i=i+num_threads) { x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); for(i=0, pi=0.0;i<num_threads;i++) pi += sum[i] * step; SPMD: Κάθε νήµα εκτελεί τον ίδιο κώδικα.το ID του νήµατος χρησιµοποιείται για τη διαφοροποίηση της συµπεριφοράς E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 24

Έκδοσηµε οµή ιαµοίρασης Έργου #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum[num_threads]; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads) #pragma omp parallel { int i; double x; int id; id = omp_get_thread_num(); sum[id] = 0.0; #pragma omp for for (i=id, i< num_steps; i++){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); for(i=0, pi=0.0;i<num_threads;i++) pi += sum[i] * step; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 25

Εµβέλειατων Εντολών OpenMP Εντολές OpenMP µπορεί να επεκτείνονται σε πολλά αρχεία. foo.f: Static ή lexical extent τουπαράλληλουτµήµατος bar.f: Dynamic extentτου παράλληλουτµήµατος Περιλαµβάνει το static extent Orphan directives: εµφανίζονται εκτός παράλληλου τµήµατος foo.f C$OMP PARALLEL call whoami C$OMP END PARALLEL bar.f subroutine whoami external omp_get_thread_num integer iam, omp_get_thread_num iam = omp_get_thread_num() C$OMP CRITICAL print*, Hello from, iam C$OMP END CRITICAL return end E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 26

ΧαρακτηριστικάΑποθήκευσης Προγραµµατιστικό µοντέλο κοινής µνήµης: Οι περισσότερες µεταβλητές είναι by default κοινές Οι global µεταβλητές είναι κοινές µεταξύ των νηµάτων Fortran: COMMON blocks, SAVE variables, MODULE variables C: File scope variables, static Όµως δεν είναι τα πάντα κοινά... Οι stack variables σε υπο-προγράµµατα που καλούνται από παράλληλα τµήµατα είναι ιδιωτικές Οι automatic variables µέσα σε ένα δοµηµένο block εντολών είναι ιδιωτικές. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 27

ΑλλαγήΧαρακτηριστικών Αποθήκευσης Οπρογραµµατιστής µπορεί να αλλάξει τα χαρακτηριστικά αποθήκευσης των µεταβλητών χρησιµοποιώντας ένα από τα ακόλουθα SHARED PRIVATE FIRSTPRIVATE THREADPRIVATE Η τιµή µιας ιδιωτικής µεταβλητής εντός ενός παράλληλου loop µπορεί να «µεταδοθεί» σαν καθολική τιµή εκτός του loop µε τη: LASTPRIVATE H default συµπεριφορά µπορεί να µεταβληθεί µε τη: DEFAULT (PRIVATE SHARED NONE) Όλες οι εντολές δεδοµένων εφαρµόζονται σε παράλληλα τµήµατα και δοµές διαµοίρασης έργου εκτός της shared η οποία εφαρµόζεται µόνο σε παράλληλα τµήµατα. Όλες οι εντολές αυτής της διαφάνειας έχουν ισχύ στο lexical extent της εντολής OpenMP. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 28

Εντολή private Η private(var) δηµιουργεί ιδιωτικό αντίγραφο της varγια κάθε νήµα Η τιµή δεν είναι αρχικοποιηµένη Το ιδιωτικό αντίγραφο δεν συσχετίζεται (όσον αφορά τον χώρο αποθήκευσης) µε το αυθεντικό program wrong IS = 0 C$OMP PARALLEL DO PRIVATE(IS) DO J=1,1000 1000 CONTINUE print *, IS IS = IS + J Το IS δεν έχει αρχικοποιηθεί µέσα στο loop Παρά την αρχικοποίηση, το IS έχει ακαθόριστη τιµή µετά το τέλος του loop E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 29

Εντολή firstprivate firstprivate: ειδική περίπτωση του private. To ιδιωτικό αντίγραφο κάθε νήµατος αρχικοποιείται µε την αντίστοιχη τιµή του νήµατος αρχηγού. program almost_right IS = 0 C$OMP PARALLEL DO FIRSTPRIVATE(IS) DO J=1,1000 1000 CONTINUE print *, IS IS = IS + J Κάθε νήµα έχει ιδιωτικό αντίγραφο του IS µε αρχική τιµή 0 Παρά την αρχικοποίηση, το IS έχειακαθόριστη τιµή σε αυτό το σηµείο E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 30

Εντολή lastprivate Περνά την τιµή της ιδιωτικής µεταβλητής από την τελευταία επανάληψη που εκτελέστηκε στην καθολική µεταβλητή program closer IS = 0 C$OMP PARALLEL DO FIRSTPRIVATE(IS) C$OMP+ LASTPRIVATE(IS) DO J=1,1000 IS = IS + J 1000 CONTINUE print *, IS Κάθε νήµα έχει ιδιωτικό αντίγραφο του IS µε αρχική τιµή 0 Το IS έχει την τιµή που είχε στηντελευταία επανάληψη (δηλ. για J=1000) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 31

Περιβάλλον εδοµένων Παράδειγµα µε χρήση των PRIVATE και FIRSTPRIVATE int A, B, C; A = B = C = 1; #pragma omp parallel private(b) firstprivate(c) { Μέσα στο παράλληλο τµήµα : Το A είναι κοινό µεταξύ των νηµάτων και ίσο µε 1 Τα B και C είναι ιδιωτικά σε κάθε νήµα. Το B έχει ακαθόριστη αρχική τιµή Το C έχει αρχική τιµή 1 Μετά το παράλληλο τµήµα : Οι τιµές των Β και C είναι ακαθόριστες E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 32

Εντολή default Ηεξ ορισµού τιµή είναι DEFAULT(SHARED) (οπότε αν αυτή είναι ηεπιθυµητή συµπεριφορά δεν χρειάζεται να κάνουµε τίποτε) Για να αλλάξουµε την εξ ορισµού συµπεριφορά: DEFAULT(PRIVATE) κάθε µεταβλητή στο static extent του παράλληλου τµήµατος γίνεται ιδιωτική (σαν να είχε καθοριστεί αυτό ρητά µε εντολή private) DEFAULT(NONE) καµία εξ ορισµού συµπεριφορά για τιςµεταβλητές στο static extent. Πρέπει να καθοριστεί ρητά η συµπεριφορά για όλες τις µεταβλητές Μόνο το Fortran API υποστηρίζει default(private) Η C/C++ υποστηρίζει µόνο default(shared) ή default(none) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 33

Εντολή threadprivate Κάνει global δεδοµένα ιδιωτικά σε κάθε νήµα Fortran: COMMON blocks C: File scope και static variables ιαφορετική συµπεριφορά από το PRIVATE Με το PRIVATE οι global µεταβλητές αποκρύπτονται. Το THREADPRIVATE διατηρεί το global scope σε κάθε νήµα Οι µεταβλητές threadprivateµπορούν να αρχικοποιηθούνχρησιµοποιώντας εντολές COPYIN ή DATA E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 34

Παράδειγµα threadprivate Θεωρήστε 2 διαφορετικές συναρτήσεις που καλούνται εντός του ίδιου παράλληλου τµήµατος. Εξαιτίας της εντολής threadprivate, κάθε νήµα που εκτελεί αυτές τις συναρτήσεις έχει δικό του αντίγραφο του common block /buf/. subroutine poo parameter (N=1000) common/buf/a(n),b(n) C$OMP THREADPRIVATE(/buf/) do i=1, N B(i)= const* A(i) end do return end subroutine bar parameter (N=1000) common/buf/a(n),b(n) C$OMP THREADPRIVATE(/buf/) do i=1, N A(i) = sqrt(b(i)) end do return end E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 35

Εντολή reduction Επηρεάζει στην ουσία τον τρόπο «διαµοίρασης» των µεταβλητών: reduction (op : list) Οι µεταβλητές στο list πρέπει να είναι shared στο παράλληλο τµήµα στου οποίου το scope βρισκόµαστε. Εντός µια δοµής parallel ή διαµοίρασης εργασίας: ηµιουργείται τοπικό αντίγραφο κάθε µεταβλητής της λίστας και αρχικοποιείται (ανάλογα µε την πράξη op π.χ. 0 για + ) Τα τοπικά αντίγραφα συνδυάζονται ώστε να εκφυλιστούν σε ένα µοναδικό global αντίγραφο στο τέλος της δοµής E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 36

#include <omp.h> #define NUM_THREADS 2 double func(int i); Παράδειγµα reduction void main () { int i; double ZZ, res=0.0; omp_set_num_threads(num_threads); #pragma omp parallel for reduction(+:res) private(zz) for (i=0; i< 1000; i++){ ZZ = func(i); res = res + ZZ; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 37

Παράδειγµα reduction Επιστρέψτεστο πρόγραµµα υπολογισµού προσέγγισης του π και αυτή τη φορά, χρησιµοποιήστε private, reduction και µια δοµή διαµοίρασης έργου για την παραλληλοποίησή του. Πόσο µοιάζει στο αρχικό, ακολουθιακό πρόγραµµα; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 38

Παράδειγµα reduction #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads) #pragma omp parallel for reduction(+:sum) private(x) for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; To OpenMP προσθέτει 2-4 γραµµές κώδικα E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 39