OpenMP Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, Νοέµβριος 2004 29/11/2004 Εισαγωγή στο OpenMP 1 1
Παράλληλες αρχιτεκτονικές Αρχιτεκτονική κατανεµηµένης µνήµης (distributed memory systems, π.χ. cluster) 29/11/2004 Εισαγωγή στο OpenMP 2 2
Παράλληλες αρχιτεκτονικές (2) Αρχιτεκτονική µοιραζόµενης µνήµης (shared memory systems, π.χ. SMP) 29/11/2004 Εισαγωγή στο OpenMP 3 3
Παράλληλες αρχιτεκτονικές (3) Σύστηµα Κατανεµηµένης Μνήµης Σύστηµα Μοιραζόµενης Μνήµης Υπέρ Επεκτάσιµο σε µεγάλο πλήθος επεξεργαστών Συχνά παράλληλα µονοπάτια Ι/Ο Σχετικά εύκολο σε προγραµµατισµό και αποσφαλµάτωση Μεγαλύτερη ευελιξία σε υψηλές απαιτήσεις µνήµης Καθολική εικόνα συστήµατος Κατά ύσκολο σε προγραµµατισµό και αποσφαλµάτωση Περιορισµένη ευελιξία σε υψηλές απαιτήσεις µνήµης Συχνά απαιτεί πολλαπλές εικόνες του συστήµατος Μη επεκτάσιµο σε µεγάλο πλήθος επεξεργαστών Συχνά υπάρχει µοναδικό µονοπάτι Ι/Ο 29/11/2004 Εισαγωγή στο OpenMP 4 4
Παράλληλες αρχιτεκτονικές (4) Υβριδική αρχιτεκτονική (DSM systems, π.χ. SMP cluster) 29/11/2004 Εισαγωγή στο OpenMP 5 5
Παράλληλες αρχιτεκτονικές (5) 29/11/2004 Εισαγωγή στο OpenMP 6 6
Τι είναι το OpenMP; Είναι πρότυπο, όχι συγκεκριµένη υλοποίηση Παρέχει API για πολυνηµατικό προγραµµατισµό (multithreaded programming) µε οδηγίες σε µεταγλωττιστή (compiler directives) βιβλιοθήκη χρόνου εκτέλεσης (run-time library) µεταβλητές συστήµατος (environment variables) Υποστηρίζει C, C++ και Fortran Προγράµµατα γραµµένα σε OpenMP µπορούν να εκτελεστούν και σειριακά 29/11/2004 Εισαγωγή στο OpenMP 7 7
Τι είναι το OpenMP; (2) Απευθύνεται κυρίως σε εφαρµογές µε πίνακες (array-based applications) Παραλληλοποίηση αρχικού προβλήµατος και δυναµική απεικόνιση σε νήµατα εκτέλεσης (threads) Τοπικά (local) και µοιραζόµενα (shared) δεδοµένα Συγχρονισµός απαιτείται για ορθή πρόσβαση στα µοιραζόµενα δεδοµένα είσοδο-έξοδο (Ι/Ο) 29/11/2004 Εισαγωγή στο OpenMP 8 8
Πολυνηµατικό µοντέλο Τα νήµατα επικοινωνούν µε µοιραζόµενες µεταβλητές (shared variables) Μοιραζόµενες µεταβλητές οδηγούν σε ανεπιθύµητες race conditions απαιτείται συγχρονισµός των νηµάτων Ο συγχρονισµός είναι «ακριβός» απαιτείται προσδιορισµός κατάλληλου τρόπου πρόσβασης δεδοµένων 29/11/2004 Εισαγωγή στο OpenMP 9 9
Τυπική δοµή κώδικα OpenMP #include <omp.h> main(){ #pragma omp parallel num_threads(2){ } omp_set_num_threads(4); #pragma omp parallel{ } } 29/11/2004 Εισαγωγή στο OpenMP 10 10
Πρότυπο 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) 29/11/2004 Εισαγωγή στο OpenMP 11 11
Παράλληλες περιοχές #pragma omp parallel ηµιουργεί οµάδα νηµάτων Αριθµός νηµάτων καθορίζεται κατά σειρά προτεραιότητας από: num_threads σε directive συνάρτηση βιβλιοθήκης omp_set_num_threads() µεταβλητή συστήµατος OMP_NUM_THREADS Υπονοείται flush κατά την είσοδο και έξοδο από την παράλληλη περιοχή Φωλιασµένες παράλληλες περιοχές σειριοποιούνται 29/11/2004 Εισαγωγή στο OpenMP 12 12
Παράδειγµα Hello world #include <omp.h> #include <stdio.h> int main(int argc,char** argv) { #pragma omp parallel printf( Hello world from thread %d\n, omp_get_thread_num()); return 0; } 29/11/2004 Εισαγωγή στο OpenMP 13 13
Κατανοµή εργασίας #pragma omp for #pragma omp sections #pragma omp single Κατανοµή εργασίας µεταξύ υπαρχόντων νηµάτων ε δηµιουργούνται νέα νήµατα Υπονοείται flush µόνο κατά την έξοδο από περιοχή κατανοµής εργασίας (όχι κατά την είσοδο) 29/11/2004 Εισαγωγή στο OpenMP 14 14
Κατανοµή εργασίας (2) #pragma omp for [schedule( )] [nowait] for-loop Κατανέµει επαναλήψεις εντολής for σε οµάδα νηµάτων Εντολή for σε κανονική µορφή (canonical form) schedule: καθορίζει τρόπο κατανοµής επαναλήψεων static[,chunk]: round-robin στατική κατανοµή dynamic[,chunk]: δυναµική κατανοµή σε ανενεργά νήµατα guided[,chunk]: δυναµική κατανοµή µε εκθετική µείωση runtime: κατανοµή καθορίζεται σε χρόνο εκτέλεσης nowait: αποτρέπει συγχρονισµό κατά την έξοδο 29/11/2004 Εισαγωγή στο OpenMP 15 15
Παράδειγµα for loop 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; } 29/11/2004 Εισαγωγή στο OpenMP 16 16
Κατανοµή εργασίας (3) #pragma omp sections [nowait] { #pragma omp section structured-block #pragma omp section structured-block } Ορίζει µία η περισσότερες ανεξάρτητες περιοχές section που κατανέµονται µεταξύ των νηµάτων Κάθε περιοχή section ανατίθεται σε διαφορετικό νήµα nowait: αποτρέπει συγχρονισµό κατά την έξοδο 29/11/2004 Εισαγωγή στο OpenMP 17 17
Κατανοµή εργασίας (4) #pragma omp single [nowait] structured-block Ορίζει τµήµα κώδικα που εκτελείται από µόνο ένα νήµα της οµάδας nowait: αποτρέπει συγχρονισµό κατά την έξοδο 29/11/2004 Εισαγωγή στο OpenMP 18 18
Παράδειγµα progress report #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(); } 29/11/2004 Εισαγωγή στο OpenMP 19 19
Παράλληλες περιοχές κατανοµής εργασίας #pragma omp parallel for for-loop #pragma omp parallel sections { #pragma omp section structured-block } ηµιουργεί οµάδα νηµάτων και κατανέµει εργασία σε αυτά Υπονοείται flush σε είσοδο και έξοδο 29/11/2004 Εισαγωγή στο OpenMP 20 20
Παράδειγµα for loop (2) #pragma omp parallel { #pragma omp for for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; } #pragma omp parallel for for(i=1;i<n;i++) b[i]=(a[i]+a[i-1])/2.0; 29/11/2004 Εισαγωγή στο OpenMP 21 21
Σειριακή εκτέλεση συγχρονισµός #pragma omp master #pragma omp critical #pragma omp barrier #pragma omp atomic #pragma omp flush #pragma omp ordered 29/11/2004 Εισαγωγή στο OpenMP 22 22
Σειριακή εκτέλεση συγχρονισµός (2) #pragma omp master structured-block Ορίζει τµήµα κώδικα που εκτελείται από το κύριο νήµα της οµάδας (master thread) εν υπονοείται συγχρονισµός (flush) τόσο κατά την είσοδο, όσο και κατά την έξοδο 29/11/2004 Εισαγωγή στο OpenMP 23 23
Σειριακή εκτέλεση συγχρονισµός (3) #pragma omp critical [name] structured-block Σε κάθε χρονική στιγµή, το πολύ ένα νήµα µπορεί να βρίσκεται µέσα σε µια critical περιοχή µε συγκεκριµένο όνοµα name Σε όλες τις «ανώνυµες» περιοχές αποδίδεται από το µεταγλωττιστή κοινό όνοµα Υπονοείται συγχρονισµός (flush) τόσο κατά την είσοδο, όσο και κατά την έξοδο 29/11/2004 Εισαγωγή στο OpenMP 24 24
Παράδειγµα 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); } 29/11/2004 Εισαγωγή στο OpenMP 25 25
Σειριακή εκτέλεση συγχρονισµός (4) #pragma omp barrier Συγχρονίζει όλα τα νήµατα µιας οµάδας εν µπορεί να είναι άµεση υπο-εντολή εντολής if Υπονοεί flush 29/11/2004 Εισαγωγή στο OpenMP 26 26
Παράδειγµα χρονοµέτρηση #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); } } 29/11/2004 Εισαγωγή στο OpenMP 27 27
Σειριακή εκτέλεση συγχρονισµός (5) #pragma omp atomic expression-stmt expression-stmt: Εντολή της µορφής x op = expr (op:+,*,-,/,&,^,,<<,>>) x++ ή ++x x-- ή --x Ενηµερώνει ατοµικά περιοχή µνήµης x Υπονοεί flush 29/11/2004 Εισαγωγή στο OpenMP 28 28
Παράδειγµα 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); } Τι διαφορά θα είχε αν βάζαµε critical αντί για atomic; 29/11/2004 Εισαγωγή στο OpenMP 29 29
Σειριακή εκτέλεση συγχρονισµός (6) #pragma omp flush [(variable-list)] Εξασφαλίζει memory consistency λίστας µεταβλητών για νήµατα Μεταγλωττιστές αποκαθιστούν τιµές καταχωρητών στη µνήµη, υλικό αποκαθιστά αποµονωτές εγγραφής στη µνήµη Υπονοείται κατά την είσοδο/έξοδο σε/από µερικές OpenMP directives (barrier, critical, ordered, parallel κλπ.) Εναλλακτική δυνατότητα: volatile variables της C Access consistency flush πριν την προσπέλαση Modify consistency flush µετά την τροποποίηση εν µπορεί να είναι άµεση υπο-εντολή εντολής if 29/11/2004 Εισαγωγή στο OpenMP 30 30
Σειριακή εκτέλεση συγχρονισµός (7) #pragma omp ordered structured-block Πρέπει να περιέχεται στην εµβέλεια ενός for ή parallel for construct Το αντίστοιχο for ή parallel for πρέπει να έχει καθορίσει ordered clause Επιβάλει σειριακή εκτέλεση ενός βρόχου for 29/11/2004 Εισαγωγή στο OpenMP 31 31
Παράδειγµα 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]); } } 29/11/2004 Εισαγωγή στο OpenMP 32 32
Περιβάλλον δεδοµένων Directive #pragma omp threadprivate Clauses private firstprivate lastprivate shared default reduction copyin copyprivate 29/11/2004 Εισαγωγή στο OpenMP 33 33
Περιβάλλον δεδοµένων (2) private (variable-list) Ανάθεση νέου αντικειµένου για κάθε νήµα Το πρότυπο αντικείµενο έχει απροσδιόριστη τιµή κατά την είσοδο και έξοδο στο construct, και δεν πρέπει να τροποποιείται firstprivate (variable-list) Σαν private, κάθε νέο αντικείµενο αρχικοποιείται στην τιµή του προτύπου lastprivate (variable-list) Σαν private, το πρότυπο αντικείµενο παίρνει τελικά την τιµή που αντιστοιχεί στη σειριακά τελευταία τιµή του construct 29/11/2004 Εισαγωγή στο OpenMP 34 34
Περιβάλλον δεδοµένων (3) shared (variable list) Μοιραζόµενη µεταβλητή για όλα τα νήµατα της οµάδας default (shared none) reduction (op: variable-list) Αναφέρεται σε εντολές τις µορφής x = x op expr, όπου op ένας από τους *, -, &, ^,, &&, Κάθε µεταβλητή το πολύ σε µια reduction clause Για κάθε µεταβλητή δηµιουργείται αντίστοιχη τοπική µεταβλητή σε κάθε νήµα και αρχικοποιείται ανάλογα µε τελεστή op Μεταβλητή σε λίστα δεν µπορεί να είναι private 29/11/2004 Εισαγωγή στο OpenMP 35 35
Παράδειγµα reduction for(i=1;i<n;i++) sum=sum+a(i); #pragma omp parallel for reduction(+:sum) for(i=1;i<n;i++) sum=sum+a(i); 29/11/2004 Εισαγωγή στο OpenMP 36 36
Βιβλιοθήκη χρόνου εκτέλεσης Περιβάλλον εκτέλεσης 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 29/11/2004 Εισαγωγή στο OpenMP 37 37
Μεταβλητές συστήµατος ροµολόγηση 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 29/11/2004 Εισαγωγή στο OpenMP 38 38
Υβριδικό µοντέλο ιαισθητικά, πιο κατάλληλο για υβριδικές αρχιτεκτονικές από απλό MPI µοντέλο Συχνά απλή εφαρµογή οδηγεί σε περιορισµό παραλληλίας µέσω νόµου Amdahl Θεωρητικά, πιο αποδοτικό για επικοινωνία στο εσωτερικό SMP κόµβου Σηµαντικοί περιορισµοί επιβάλλονται και από επίπεδο πολυνηµατικής υποστήριξης του MPI 29/11/2004 Εισαγωγή στο OpenMP 39 39
Υβριδικό µοντέλο (2) 29/11/2004 Εισαγωγή στο OpenMP 40 40
Υβριδικό µοντέλο (3) Επίπεδο υποστήριξης OpenMP από MPI: MPI_THREAD_SINGLE MPI_THREAD_FUNNELED MPI_THREAD_SERIALIZED MPI_THREAD_MULTIPLE 29/11/2004 Εισαγωγή στο OpenMP 41 41
Υβριδικό µοντέλο (4) Παράδειγµα κώδικα: 29/11/2004 Εισαγωγή στο OpenMP 42 42
Εκτέλεση υβριδικού προγράµµατος MPI+OpenMP Linux cluster 8 dual PIII 800MHz κόµβων (twins) Το πολύ 8 διεργασίες MPI x 2 νήµατα OpenMP/διεργασία ssh2 danaos.cslab.ntua.gr ; ssh2 twin1 Intel compiler C++ 8.1 icc (στο /usr/local/intel/compiler80/ia32/bin) MPI µε icc στο /usr/local/mpich-intel για υβριδικό µοντέλο 29/11/2004 Εισαγωγή στο OpenMP 43 43
Εκτέλεση υβριδικού προγράµµατος 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 29/11/2004 Εισαγωγή στο OpenMP 44 44
Σχετικοί σύνδεσµοι http://www.openmp.org (OpenMP standards) http://www.compunity.org (Community of OpenMP users) http://oscinfo.osc.edu/training (υλικό από Ohio Supercomputing Center) 29/11/2004 Εισαγωγή στο OpenMP 45 45