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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

Εισαγωγή στον Προγραμματισμό (με. τη C)

Η πολυνηματική γλώσσα προγραμματισμού Cilk

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

Ηλεκτρονικοί Υπολογιστές

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

Κεφάλαιο : Επαναλήψεις (for, do-while)

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

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

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

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Κεφάλαιο : Εισαγωγή στην C: (Διαλέξεις 3-4)

Υπολογισμός - Εντολές Επανάληψης

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

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

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

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

ΠαράδειγµαΠρογραµµατισµού

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

Ανάλυση ροής δεδομένων και autoscoping στον παραλληλοποιητικό μεταφραστή OMPi

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

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

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

Ενσωματωμένα Συστήματα

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

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

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

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

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

ιορθώσεις επί της 2 ης έκδοσης εκτύπωσης 2002

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

Προγραμματισμός I (Θ)

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

Cilk: Φιλοσοφία και Χρήση

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

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

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

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

Βασικές Αρχές Προγραμματισμού

Εισαγωγή στην Πληροφορική

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

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

ΗΥ-150. Πίνακες (Arrays)

Transcript:

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

Ορολογία Μιαοµάδα νηµάτων στο OpenMPαποτελείται από το κύριο νήµα (master) και τους εργάτες (workers) Ένα παράλληλο τµήµα είναι ένα κοµµάτι κώδικα που εκτελείται από όλα τα νήµατα ταυτόχρονα Το κύριο νήµα έχει πάντοτε αριθµό αναγνωριστικού = 0 Ο ορισµός του µεγέθους της οµάδας νηµάτων, εφόσον επιτρέπεται, πραγµατοποιείται πριν την εισαγωγή σε µια παράλληλη περιοχή Οι παράλληλες περιοχές µπορεί να είναι εµφωλευµένες, αλλά η υποστήριξη της εκτέλεσης εσωτερικών επιπέδων εξαρτάται από την υλοποίηση Μια δοµή διαµοίρασης έργου µοιράζει την εκτέλεση του κώδικα που περιέχεται στο παράλληλο τµήµα µεταξύ των µελών της οµάδας νηµάτων Εποµένως, χωρίζει κατάλληλα τη δουλειά E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 2

Παράδειγµα 1 #pragma omp parallel shared(n,x,y) private(i) num_threads(4) #pragma omp for for (i=0; i<n; i++) x[i] += y[i]; /*-- End of parallel region --*/ E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 3

Παράδειγµα 2 void mxv_row(int m,int n,double *a,double *b,double *c) int i, j; double sum; #pragma omp parallel for private(i, j, sum) shared(m, n, a, b, c) for (i=0; i<m; i++) sum = 0.0; for (j=0; j<n; j++) sum += b[i*n+j]*c[j]; a[i] = sum; /*-- End of parallel for --*/ E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 4

Παράδειγµα 3 #pragma omp parallel shared(n,a,b,c,d) private(i) #pragma omp for nowait for (i=0; i<n-1; i++) b[i] = (a[i] + a[i+1])/2; #pragma omp for nowait for (i=0; i<n; i++) d[i] = 1.0/c[i]; /*-- End of parallel region --*/ (implied barrier) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 5

ΕξισορρόπησηΕργασίας Αποτελεί βασικό παράγοντα απόδοσης Για συνηθισµένες λειτουργίες, π.χ. πρόσθεση διανυσµάτων, η εξισορρόπηση εργασίας δεν αποτελείται ζήτηµα Για λιγότερο οµαλές λειτουργίες πρέπει να δοθεί ιδιαίτερη σηµασία στην διαµοίραση της εργασίας µεταξύ των νηµάτων Παράδειγµα µη οµαλών (irregular) λειτουργιών: Αντιµετάθεση ενός πίνακα Πολλαπλασιασµός τριγωνικών πινάκων Παράλληλες αναζητήσεις σε µία διασυνδεδεµένη λίστα Για τέτοιες περιπτώσεις, η δοµή διαµοίραση for χρησιµοποιείται µε την οδηγία schedule που καθορίζει διάφορους αλγορίθµους δροµολόγησης των επαναλήψεων E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6

Οδηγία schedule Χρήση schedule ( static dynamic guided [, chunk] ) schedule (runtime) static [,chunk] ιαµοιράζει τις επαναλήψεις, που έχουν χωριστεί σε τµήµατα µεγέθους "chunk«, µεταξύ των νηµάτων µε κυκλικό τρόπο Αν δεν ορίζεται το "chunk", αυτό ορίζεται κατά προσέγγιση ίσο µε N/P και κάθε νήµα εκτελεί ένα τµήµα επαναλήψεων dynamic [,chunk] ιαχωρίζει τις επαναλήψεις σε τµήµατα µεγέθους "chunk Κάθε νήµα µόλις τελειώσει ένα τµήµα, παίρνει δυναµικά το επόµενο guided [,chunk] Παρόµοια µε dynamic, αλλά το µέγεθος του τµήµατος µειώνεται εκθετικά runtime Ο αλγόριθµος δροµολόγησης καθορίζεται κατά τον χρόνο εκτέλεσης ελέγχοντας τη µεταβλητή περιβάλλοντος OMP_SCHEDULE E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 7

Παράδειγµα Πολλαπλά chunks E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 8

Συγχρονισµός To OpenMPορίζει τις ακόλουθες εντολές για την υποστήριξη συγχρονισµού: atomic critical section barrier flush ordered single (Στην πραγµατικότητα είναι δοµή διαµοίρασης έργου που περιλαµβάνει συγχρονισµό) master (Στην ουσία δεν είναι εντολή συγχρονισµού) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 9

Συγχρονισµός critical Μόνοένα νήµα µπορεί κάθε στιγµή να µπει στο critical section #pragma omp parallel for private(b) shared(res) for (i =0; i<niters; i++) b = doit(i); #pragma omp critical consume(b, &res); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 10

Συγχρονισµός atomic To atomicείναι ειδική περίπτωση του critical section πουµπορεί να χρησιµοποιηθεί για ορισµένες απλές εντολές. Εφαρµόζεται µόνο για την ανανέωση µιας θέσης µνήµης (την ανανέωση του x στο ακόλουθο παράδειγµα) #pragma omp parallel private(b) b = doit(i); #pragma omp atomic x = x + b; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 11

Συγχρονισµός barriers Barrier: Κάθε νήµα περιµένει να φτάσουν όλα ταυπόλοιπα νήµατα πριν προχωρήσει. #pragma omp parallel shared (A, B, C) private(id) id=omp_get_thread_num(); A[id] = big_calc1(id); #pragma omp barrier #pragma omp for for(i=0;i<n;i++) C[i]=big_calc3(I,A); /* υπονοούµενο barrier */ #pragma omp for nowait for(i=0;i<n;i++) B[i]=big_calc2(C, i); /* χωρίς barrier */ A[id] = big_calc3(id); /* υπονοούµενο barrier */ E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 12

Συγχρονισµός ordered Η εντολή ordered επιβάλει την ακολουθιακή σειρά εκτέλεσης για ένα τµήµα #pragma omp parallel private (res) #pragma omp for ordered for (i=0;i<n;i++) res = do_work(i); #pragma ordered printf( res = %d\n, res); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 13

Συγχρονισµός master Ηεντολή master χαρακτηρίζει ένα δοµηµένο block τοοποίο εκτελείται µόνο από το νήµα -αρχηγό. Τα υπόλοιπανήµατα το αγνοούν (δεν υπάρχουν υπονοούµενα barriers ή flushes). #pragma omp parallel private (tmp) do_many_things(); #pragma omp master exchange_boundaries(); #pragma barrier do_many_other_things(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 14

Συγχρονισµός single Η εντολή single χαρακτηρίζει ένα block κώδικα το οποίο εκτελείται από ένα µόνο νήµα. Υπονοούνται barrier και flush στο τέλος του single block #pragma omp parallel private (tmp) do_many_things(); #pragma omp single exchange_boundaries(); do_many_other_things(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 15

Συγχρονισµός flush Η εντολή flush δηλώνει ένα σηµείο στο οποίο το νήµα επιχειρεί να δηµιουργήσει συνεπή εικόνα της µνήµης. Όλες οι πράξεις µνήµης (αναγνώσεις και εγγραφές) που ορίζονται πριν από αυτό το σηµείο πρέπει να ολοκληρωθούν. Όλες οι πράξεις µνήµης (αναγνώσεις και εγγραφές) που ορίζονται µετά απόαυτό το σηµείο πρέπει να εκτελεστούν µετά το flush Οι µεταβλητές σε registers ή write buffers πρέπει να εγγραφούν στη µνήµη Τα ορίσµατα του flush ορίζουν ποιες µεταβλητές θα γίνουν flush. Αν δεν υπάρχουν ορίσµατα όλες οι ορατές στο νήµα µεταβλητές γίνονται flush. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 16

ΥπονοούµενοςΣυγχρονισµός Barriers υπονοούνται µετά τις ακόλουθες εντολές OpenMP: end parallel end do (except when nowait is used) end sections (except when nowait is used) end critical end single (except when nowait is used) Flush υπονοείται µετά τις ακόλουθες εντολές OpenMP: barrier critical, end critical end do end parallel end sections end single ordered, end ordered E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 17

Συναρτήσεις locks ΣυναρτήσειςΒιβλιοθήκης omp_init_lock(), omp_set_lock(), omp_unset_lock(), omp_test_lock() Συναρτήσεις περιβάλλοντος χρόνου εκτέλεσης: Αλλαγή/Έλεγχος του αριθµού των νηµάτων omp_set_num_threads(), omp_get_num_threads(), omp_get_thread_num(), omp_get_max_threads() Ενεργοποίηση/απενεργοποίηση εµφωλευµένου παραλληλισµού και dynamic mode omp_set_nested(), omp_set_dynamic(), omp_get_nested(), omp_get_dynamic() Έλεγχος εκτέλεσης σε παράλληλο τµήµα omp_in_parallel() Αριθµός επεξεργαστών στο σύστηµα omp_num_procs() E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 18

ΠροστασίαΠόρων µε locks omp_lock_t lck; omp_init_lock(&lck); #pragma omp parallel private (tmp) id = omp_get_thread_num(); tmp = do_lots_of_work(id); omp_set_lock(&lck); printf( %d%d, id, tmp); omp_unset_lock(&lck); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 19

Συναρτήσειςβιβλιοθήκης Γιανα ελεγχθεί ο αριθµός των νηµάτων που εκτελούν ένα πρόγραµµα αρχικά απενεργοποιείται το dynamic mode και κατόπιν καθορίζεται ο αριθµός των νηµάτων. #include <omp.h> void main() omp_set_dynamic(0); omp_set_num_threads(4); #pragma omp parallel int id=omp_get_thread_num(); do_lots_of_stuff(id); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 20

ΜεταβλητέςΠεριβάλλοντος Έλεγχος scheduling των loops εφόσον έχει καθοριστεί omp for schedule(runtime). OMP_SCHEDULE schedule[, chunk_size] Καθορισµός του default αριθµού νηµάτων. OMP_NUM_THREADS int_literal Ενεργοποίηση/απενεργοποίηση dynamic mode OMP_DYNAMIC TRUE FALSE Ενεργοποίηση/απενεργοποίηση παράλληλης εκτέλεσης εµφωλευµένων παράλληλων τµηµάτων OMP_NESTED TRUE FALSE E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 21

Χρήση Κώδικας OpenMP #include <omp.h> #include <stdio.h> void main() #pragma omp parallel printf( Hello world from thread %d of %d\n, omp_get_thread_num(), omp_get_num_threads(); Παραγωγή εκτελέσιµου αρχείου για OMPi, GNU GCC 4.2, Intel compiler, Sun Studio compiler) $ ompicc -o hello hello.c $ gcc -fopenmp -o hello hello.c $ icc -openmp -o hello hello.c $ suncc -xopenmp=parallel -o hello hello.c E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 22

Εκτέλεση Χρήση $ export OMP_NUM_THREADS=4 $./hello Hello world from thread 0 of 4 Hello world from thread 2 of 4 Hello world from thread 1 of 4 Hello world from thread 3 of 4 $ export OMP_NUM_THREADS=1 $./hello Hello world from thread 0 of 1 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 23

OpenMP consortium http://www.openmp.org OpenMP community Βιβλιογραφία Links http://www.compunity.org Intel Compilers http://developer.intel.com/software/products/compilers The OMPi Compiler http://www.cs.uoi.gr/~ompi OpenMP Application Program Interface, Version 2.5, 2005 ιαθέσιµο και στη σελίδα του µαθήµατος E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 24

Παράδειγµα 1 void a1(int n, float *a, float *b) int i; #pragma omp parallel for for (i=1; i<n; i++) /* i is private by default */ b[i] = (a[i] + a[i-1]) / 2.0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 25

Παράδειγµα 2 #include <stdio.h> #include <omp.h> int main() int x = 2; #pragma omp parallel num_threads(2) shared(x) if (omp_get_thread_num() == 0) x = 5; else printf("1: Thread# %d: x = %d\n", omp_get_thread_num(),x ); #pragma omp barrier if (omp_get_thread_num() == 0) printf("2: Thread# %d: x = %d\n", omp_get_thread_num(),x ); else printf("3: Thread# %d: x = %d\n", omp_get_thread_num(),x ); return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 26

Παράδειγµα 3 #include <stdio.h> int main() # ifdef _OPENMP printf("compiled by an OpenMP-compliant implementation.\n"); # endif return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 27

Παράδειγµα 4 #include <omp.h> void sub(float *x, int npoints) int iam, nt, ipoints, istart; #pragma omp parallel private(iam,nt,ipoints,istart) iam = omp_get_thread_num(); nt = omp_get_num_threads(); ipoints = npoints / nt; /* size of partition */ istart = iam * ipoints; /* starting array index */ if (iam == nt-1) /* last thread may do more */ ipoints = npoints - istart; subdomain(x, istart, ipoints); void subdomain(float *x, int istart, int ipoints) int i; for (i = 0; i < ipoints; i++) x[istart+i] = 123.456; void main() float array[10000]; sub(array, 10000); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 28

Παράδειγµα 5 #include <omp.h> int main() omp_set_dynamic(1); #pragma omp parallel num_threads(10) /* do work here at most 10 threads */ return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 29

Παράδειγµα 6 #include <math.h> void a8(int n, int m, float *a, float *b, float *y, float *z) int i; #pragma omp parallel #pragma omp for nowait for (i=1; i<n; i++) b[i] = (a[i] + a[i-1]) / 2.0; #pragma omp for nowait for (i=0; i<m; i++) y[i] = sqrt(z[i]); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 30

Παράδειγµα 7 void XAXIS(); void YAXIS(); void ZAXIS(); void a9() #pragma omp parallel sections #pragma omp section XAXIS(); #pragma omp section YAXIS(); #pragma omp section ZAXIS(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 31

#include <stdio.h> void work1() void work2() Παράδειγµα 8 void a10() #pragma omp parallel #pragma omp single printf("beginning work1.\n"); work1(); #pragma omp single printf("finishing work1.\n"); #pragma omp single nowait printf("finished work1 and beginning work2.\n"); work2(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 32

int dequeue(float *a); void work(int i, float *a); Παράδειγµα 9 void a13(float *x, float *y) int ix_next, iy_next; #pragma omp parallel shared(x, y) private(ix_next, iy_next) #pragma omp critical (xaxis) ix_next = dequeue(x); work(ix_next, x); #pragma omp critical (yaxis) iy_next = dequeue(y); work(iy_next, y); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 33

int counter = 0; #pragma omp threadprivate(counter) int increment_counter() counter++; return(counter); Παράδειγµα 10 int increment_counter_2() static int counter_2 = 0; #pragma omp threadprivate(counter_2) counter_2++; return(counter_2); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 34

void work(int i, int j) Παράδειγµα 11 void good_nesting(int n) int i, j; #pragma omp parallel default(shared) #pragma omp for for (i=0; i<n; i++) #pragma omp parallel shared(i, n) #pragma omp for for (j=0; j < n; j++) work(i, j); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 35