1/12/2003Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων
1/12/2003Εισαγωγή στο OpenMP2 Παράλληλες αρχιτεκτονικές Αρχιτεκτονική κατανεμημένης μνήμης (distributed memory systems, π.χ. cluster)
1/12/2003Εισαγωγή στο OpenMP3 Παράλληλες αρχιτεκτονικές (2) Αρχιτεκτονική μοιραζόμενης μνήμης (shared memory systems, π.χ. SMP)
1/12/2003Εισαγωγή στο OpenMP4 Παράλληλες αρχιτεκτονικές (3) ΥπέρΚατά Σύστημα Κατανεμημένης Μνήμης Επεκτάσιμο σε μεγάλο πλήθος επεξεργαστών Συχνά παράλληλα μονοπάτια Ι/Ο Δύσκολο σε προγραμματισμό και αποσφαλμάτωση Περιορισμένη ευελιξία σε υψηλές απαιτήσεις μνήμης Συχνά απαιτεί πολλαπλές εικόνες του συστήματος Σύστημα Μοιραζόμενης Μνήμης Σχετικά εύκολο σε προγραμματισμό και αποσφαλμάτωση Μεγαλύτερη ευελιξία σε υψηλές απαιτήσεις μνήμης Καθολική εικόνα συστήματος Μη επεκτάσιμο σε μεγάλο πλήθος επεξεργαστών Συχνά υπάρχει μοναδικό μονοπάτι Ι/Ο
1/12/2003Εισαγωγή στο OpenMP5 Υβριδική αρχιτεκτονική (DSM systems, π.χ. SMP cluster) Παράλληλες αρχιτεκτονικές (4)
1/12/2003Εισαγωγή στο OpenMP6 Παράλληλες αρχιτεκτονικές (5)
1/12/2003Εισαγωγή στο OpenMP7 Τι είναι το OpenMP; Είναι πρότυπο, όχι συγκεκριμένη υλοποίηση Παρέχει API για πολυνηματικό προγραμματισμό (multithreaded programming) με οδηγίες σε μεταγλωττιστή (compiler directives) βιβλιοθήκη χρόνου εκτέλεσης (run-time library) μεταβλητές συστήματος (environment variables) Υποστηρίζει C, C++ και Fortran Προγράμματα γραμμένα σε OpenMP μπορούν να εκτελεστούν και σειριακά
1/12/2003Εισαγωγή στο OpenMP8 Τι είναι το OpenMP; (2) Απευθύνεται κυρίως σε εφαρμογές με πίνακες (array-based applications) Παραλληλοποίηση αρχικού προβλήματος και δυναμική απεικόνιση σε νήματα εκτέλεσης (threads) Τοπικά (local) και μοιραζόμενα (shared) δεδομένα Συγχρονισμός απαιτείται για ορθή πρόσβαση στα μοιραζόμενα δεδομένα είσοδο-έξοδο (Ι/Ο)
1/12/2003Εισαγωγή στο OpenMP9 Πολυνηματικό μοντέλο Τα νήματα επικοινωνούν με μοιραζόμενες μεταβλητές (shared variables) Μοιραζόμενες μεταβλητές οδηγούν σε ανεπιθύμητες συνθήκες ανταγωνισμού (race conditions) απαιτείται συγχρονισμός των νημάτων Ο συγχρονισμός είναι «ακριβός» απαιτείται προσδιορισμός κατάλληλου τρόπου πρόσβασης δεδομένων για ελαχιστοποίηση συγχρονισμού
1/12/2003Εισαγωγή στο OpenMP10 Τυπική δομή κώδικα OpenMP #include main(){ … #pragma omp parallel num_threads(2){ … } … omp_set_num_threads(4); #pragma omp parallel{ … } … }
1/12/2003Εισαγωγή στο OpenMP11 Πρότυπο 2.0 OpenMP Οδηγίες σε μεταγλωττιστή (compiler directives) Παράλληλες περιοχές (parallel regions) Κατανομή εργασίας (work sharing constructs) Παράλληλες περιοχές κατανομής εργασίας (parallel work sharing constructs) Σειριακή εκτέλεση – συγχρονισμός (master and synchronization directives) Περιβάλλον δεδομένων (data environment) Βιβλιοθήκη χρόνου εκτέλεσης (run-time library) Μεταβλητές συστήματος (environment variables)
1/12/2003Εισαγωγή στο OpenMP12 #pragma omp parallel Δημιουργεί ομάδα νημάτων Αριθμός νημάτων καθορίζεται κατά σειρά προτεραιότητας από: num_threads σε directive συνάρτηση βιβλιοθήκης omp_set_num_threads() μεταβλητή συστήματος OMP_NUM_THREADS Υπονοείται flush κατά την είσοδο και έξοδο από την παράλληλη περιοχή Φωλιασμένες παράλληλες περιοχές σειριοποιούνται Παράλληλες περιοχές
1/12/2003Εισαγωγή στο OpenMP13 #include int main(int argc,char** argv) { #pragma omp parallel printf(“Hello world from thread %d\n”, omp_get_thread_num()); return 0; } Παράδειγμα – Hello world
1/12/2003Εισαγωγή στο OpenMP14 #pragma omp for #pragma omp sections #pragma omp single Κατανομή εργασίας μεταξύ υπαρχόντων νημάτων Δε δημιουργούνται νέα νήματα Υπονοείται flush μόνο κατά την έξοδο από περιοχή κατανομής εργασίας (όχι κατά την είσοδο) Κατανομή εργασίας
1/12/2003Εισαγωγή στο OpenMP15 #pragma omp for [schedule(…)] [nowait] for-loop Κατανομή εργασίας (2) Κατανέμει επαναλήψεις εντολής for σε ομάδα νημάτων Εντολή for σε κανονική μορφή (canonical form) schedule : καθορίζει τρόπο κατανομής επαναλήψεων static[,chunk] : round-robin στατική κατανομή dynamic[,chunk] : δυναμική κατανομή σε ανενεργά νήματα guided[,chunk] : δυναμική κατανομή με εκθετική μείωση runtime : κατανομή καθορίζεται σε χρόνο εκτέλεσης nowait : αποτρέπει συγχρονισμό κατά την έξοδο
1/12/2003Εισαγωγή στο OpenMP16 for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; Παράδειγμα – for loop #pragma omp parallel { #pragma omp for for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; }
1/12/2003Εισαγωγή στο OpenMP17 #pragma omp sections [nowait] { #pragma omp section structured-block #pragma omp section structured-block } Κατανομή εργασίας (3) Ορίζει μία η περισσότερες ανεξάρτητες περιοχές section που κατανέμονται μεταξύ των νημάτων Κάθε περιοχή section ανατίθεται σε διαφορετικό νήμα nowait : αποτρέπει συγχρονισμό κατά την έξοδο
1/12/2003Εισαγωγή στο OpenMP18 #pragma omp single [nowait] structured-block Ορίζει τμήμα κώδικα που εκτελείται από μόνο ένα νήμα της ομάδας nowait : αποτρέπει συγχρονισμό κατά την έξοδο Κατανομή εργασίας (4)
1/12/2003Εισαγωγή στο OpenMP19 #pragma omp parallel { #pragma omp single printf(“Beginning work1.\n”); work1(); #pragma omp single printf(“Finished work1.\n”); #pragma omp single nowait printf(“Finished work1, beginning work2.\n”); work2(); } Παράδειγμα – progress report
1/12/2003Εισαγωγή στο OpenMP20 #pragma omp parallel for for-loop #pragma omp parallel sections { #pragma omp section structured-block … } Δημιουργεί ομάδα νημάτων και κατανέμει εργασία σε αυτά Υπονοείται flush σε είσοδο και έξοδο Παράλληλες περιοχές κατανομής εργασίας
1/12/2003Εισαγωγή στο OpenMP21 Παράδειγμα – for loop (2) #pragma omp parallel for for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; #pragma omp parallel { #pragma omp for for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; }
1/12/2003Εισαγωγή στο OpenMP22 #pragma omp master #pragma omp critical #pragma omp barrier #pragma omp atomic #pragma omp flush #pragma omp ordered Σειριακή εκτέλεση – συγχρονισμός
1/12/2003Εισαγωγή στο OpenMP23 #pragma omp master structured-block Ορίζει τμήμα κώδικα που εκτελείται από το κύριο νήμα της ομάδας (master thread) Δεν υπονοείται συγχρονισμός (flush) τόσο κατά την είσοδο, όσο και κατά την έξοδο Σειριακή εκτέλεση – συγχρονισμός (2)
1/12/2003Εισαγωγή στο OpenMP24 #pragma omp critical [name] structured-block Σε κάθε χρονική στιγμή, το πολύ ένα νήμα μπορεί να βρίσκεται μέσα σε μια critical περιοχή με συγκεκριμένο όνομα name Σε όλες τις «ανώνυμες» περιοχές αποδίδεται από το μεταγλωττιστή κοινό όνομα Υπονοείται συγχρονισμός (flush) τόσο κατά την είσοδο, όσο και κατά την έξοδο Σειριακή εκτέλεση – συγχρονισμός (3)
1/12/2003Εισαγωγή στο OpenMP25 #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); } Παράδειγμα – critical
1/12/2003Εισαγωγή στο OpenMP26 #pragma omp barrier Συγχρονίζει όλα τα νήματα μιας ομάδας Δεν μπορεί να είναι άμεση υπο-εντολή εντολής if Υπονοεί flush Σειριακή εκτέλεση – συγχρονισμός (4)
1/12/2003Εισαγωγή στο OpenMP27 #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); } Παράδειγμα – χρονομέτρηση
1/12/2003Εισαγωγή στο OpenMP28 #pragma omp atomic expression-stmt expression-stmt: Εντολή της μορφής x op = expr (op:+,*,-,/,&,^,|, >) x++ ή ++x x-- ή --x Ενημερώνει ατομικά περιοχή μνήμης x Υπονοεί flush Σειριακή εκτέλεση – συγχρονισμός (5)
1/12/2003Εισαγωγή στο OpenMP29 #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); } Παράδειγμα – atomic Τι διαφορά θα είχε αν βάζαμε critical αντί για atomic;
1/12/2003Εισαγωγή στο OpenMP30 #pragma omp flush [(variable-list)] Εξασφαλίζει memory consistency λίστας μεταβλητών για νήματα Μεταγλωττιστές αποκαθιστούν τιμές καταχωρητών στη μνήμη, υλικό αποκαθιστά απομονωτές εγγραφής στη μνήμη Υπονοείται κατά την είσοδο/έξοδο σε/από μερικές OpenMP directives (barrier, critical, ordered, parallel κλπ.) Εναλλακτική δυνατότητα: volatile variables της C Access consistency flush πριν την προσπέλαση Modify consistency flush μετά την τροποποίηση Δεν μπορεί να είναι άμεση υπο-εντολή εντολής if Σειριακή εκτέλεση – συγχρονισμός (6)
1/12/2003Εισαγωγή στο OpenMP31 #pragma omp ordered structured-block Πρέπει να περιέχεται στην εμβέλεια ενός for ή parallel for construct Το αντίστοιχο for ή parallel for πρέπει να έχει καθορίσει ordered clause Επιβάλει σειριακή εκτέλεση ενός βρόχου for Σειριακή εκτέλεση – συγχρονισμός (7)
1/12/2003Εισαγωγή στο OpenMP32 #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]); } Παράδειγμα – ordered
1/12/2003Εισαγωγή στο OpenMP33 Directive #pragma omp threadprivate Clauses private firstprivate lastprivate shared default reduction copyin copyprivate Περιβάλλον δεδομένων
1/12/2003Εισαγωγή στο OpenMP34 private (variable-list) Ανάθεση νέου αντικειμένου για κάθε νήμα Το πρότυπο αντικείμενο έχει απροσδιόριστη τιμή κατά την είσοδο και έξοδο στο construct, και δεν πρέπει να τροποποιείται firstprivate (variable-list) Σαν private, κάθε νέο αντικείμενο αρχικοποιείται στην τιμή του προτύπου lastprivate (variable-list) Σαν private, το πρότυπο αντικείμενο παίρνει τελικά την τιμή που αντιστοιχεί στη σειριακά τελευταία τιμή του construct Περιβάλλον δεδομένων (2)
1/12/2003Εισαγωγή στο OpenMP35 #pragma omp parallel { #pragma omp for lastprivate(i) for (i=0;i<n-1;i++) a[i]=b[i]+b[i+1]; } a[i]=b[i]; Παράδειγμα – lastprivate Τι πρόβλημα θα υπήρχε αν ορίζαμε απλά private(i) ;
1/12/2003Εισαγωγή στο OpenMP36 shared (variable list) Μοιραζόμενη μεταβλητή για όλα τα νήματα της ομάδας default (shared | none) reduction (op: variable-list) Αναφέρεται σε εντολές τις μορφής x = x op expr, όπου op ένας από τους *, -, &, ^, |, &&, || Κάθε μεταβλητή το πολύ σε μια reduction clause Για κάθε μεταβλητή δημιουργείται αντίστοιχη τοπική μεταβλητή σε κάθε νήμα και αρχικοποιείται ανάλογα με τελεστή op Μεταβλητή σε λίστα δεν μπορεί να είναι private Περιβάλλον δεδομένων (3)
1/12/2003Εισαγωγή στο OpenMP37 for(i=1;i<n;i++) sum=sum+a(i); Παράδειγμα – reduction #pragma omp parallel for reduction(+:sum) for(i=1;i<n;i++) sum=sum+a(i);
1/12/2003Εισαγωγή στο OpenMP38 Περιβάλλον εκτέλεσης omp_set_num_threads omp_get_thread_num omp_set_dynamic Συγχρονισμός με κλειδώματα omp_init_lock omp_set_lock / omp_test_lock omp_unset_lock nested Χρονομέτρηση omp_get_wtime omp_get_wtick Βιβλιοθήκη χρόνου εκτέλεσης
1/12/2003Εισαγωγή στο OpenMP39 Δρομολόγηση export OMP_SCHEDULE=“static” export OMP_SCHEDULE=“static,100” setenv OMP_SCHEDULE “dynamic,20” setenv OMP_SCHEDULE “guided,50” Δυναμική πολυνηματική εκτέλεση export OMP_DYNAMIC=TRUE setenv OMP_DYNAMIC FALSE Πλήθος νημάτων export OMP_NUM_THREADS=2 Μεταβλητές συστήματος
1/12/2003Εισαγωγή στο OpenMP40 Υβριδικό μοντέλο MPI+OpenMP Αποσκοπεί στην αξιοποίηση αρχιτεκτονικών κατανεμημένης/μοιραζόμενης μνήμης (SMP cluster) OpenMP για επικοινωνία στο εσωτερικό του SMP κόμβου MPI για επικοινωνία μεταξύ διαφορετικών κόμβων Περιορισμένη πολυνηματική υποστήριξη του MPI: δεν επιτρέπεται κλήση ρουτινών MPI σε παράλληλες περιοχές OpenMP
1/12/2003Εισαγωγή στο OpenMP41 for(tile t){ MPI_Recv(rank,t); Compute(rank,t); MPI_Send(rank,t); } Υβριδικό μοντέλο MPI+OpenMP (2) for(tile t){ MPI_Recv(rank,t); #pragma omp parallel Compute(rank,id,t); MPI_Send(rank,t); } π.χ. 16 διεργασίες MPI π.χ. 8 διεργασίες MPI x 2 νήματα OpenMP/διεργασία
1/12/2003Εισαγωγή στο OpenMP42 Υβριδικό μοντέλο MPI+OpenMP (3)
1/12/2003Εισαγωγή στο OpenMP43 Εκτέλεση υβριδικού προγράμματος MPI+OpenMP Linux cluster 8 dual PIII 800MHz κόμβων (twins) Το πολύ 8 διεργασίες MPI x 2 νήματα OpenMP/διεργασία ssh2 danaos.cslab.ntua.gr ; ssh2 twin1 Intel compiler 7 icc (στο /usr/local/intel/compiler70/ia32/bin) MPI με icc στο /usr/local/mpich-intel για υβριδικό μοντέλο
1/12/2003Εισαγωγή στο OpenMP44 Εκτέλεση υβριδικού προγράμματος MPI+OpenMP (2) Μεταγλώττιση: #/usr/local/mpich-intel/bin/mpicc hybrid.c –o hybrid –O3 –static –Wall Εκτέλεση: #/usr/local/mpich-intel/bin/mpirun –np 4 – machinefile machines hybrid
1/12/2003Εισαγωγή στο OpenMP45 Σχετικοί σύνδεσμοι (OpenMP standards) (Community of OpenMP users) (υλικό από Ohio Supercomputing Center)