Παράλληλος προγραμματισμός σε αρχιτεκτονικές κατανεμημένης μνήμης: MPI και UPC Συστήματα Παράλληλης Επεξεργασίας 9ο Εξάμηνο, ΣΗΜΜΥ Εργ. Υπολογιστικών Συστημάτων Σχολή ΗΜΜΥ, Ε.Μ.Π. Νοέμβριος 2015
1 Επισκόπηση 2 MPI 3 UPC 2 11/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 MPI 3 UPC 3 11/2015 Συστήματα Παράλληλης Επεξεργασίας
Επισκόπηση Αρχιτεκτονικές και Προγραμματιστικά Μοντέλα από την Οπτική του Προγραμματιστή Προγραμματιστικά Μοντέλα Κοινού Χώρου Διευθύνσεων με Πέρασμα Μηνυμάτων Αρχιτεκτονικές Κοινής μνήμης Κατανεμημένης Μνήμης + Ευκολία Υλοποίησης + Προγραμματιστική Ευκολία + Προγραμματιστική Ευκολία - Δυσκολία Υλοποίησης + Υψηλή Επίδοση - Χαμηλή Επίδοση + Ευκολία Υλοποίησης + Ευκολία Υλοποίησης + Υψηλή Επίδοση + Υψηλή Επίδοση - Προγραμματιστική Δυσκολία - Προγραμματιστική Δυσκολία 4 11/2015 Συστήματα Παράλληλης Επεξεργασίας
Επισκόπηση Ο Xάρτης των Eργαλείων και Γλωσσών Παράλληλου Προγραμματισμού Προγραμματιστικά Μοντέλα Κοινού Χώρου Διευθύνσεων με Πέρασμα Μηνυμάτων Αρχιτεκτονικές Κοινής μνήμης Κατανεμημένης Μνήμης POSIX reads, OpenMP, CoArray Fortran, reading Building Blocks, Unified Parallel C (UPC), Cilk, OmpSs Chapel and other PGAS Ομοίως με πέρασμα MPI, PVM (obsolete), μηνυμάτων σε κατανεμημένη Charm++ μνήμη 5 11/2015 Συστήματα Παράλληλης Επεξεργασίας
Σύνοψη Παρουσίασης H διαδρομή του MPI Πριν το MPI Η αρχή του MPI: MPI-1 Νέες αρχιτεκτονικές και ανάγκες: MPI-2 Petascale και Exascale: MPI-3 H γλώσσα UPC ως εναλλακτική Διαφορές PGAS - Message Passing Χαρακτηριστικά της UPC Λειτουργία: Υλοποίηση και σύστημα χρόνου εκτέλεσης 6 11/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 MPI 3 UPC 7 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Πριν το MPI Στις αρχές του 90 προέκυψε η ανάγκη για πρακτικό παράλληλο προγραμματισμό σε συστήματα κατανεμημένης μνήμης Eταιρείες και εργαστήρια πρότειναν και διατηρούσαν δικές τους γλώσσες, διεπαφές και βιβλιοθήκες παράλληλου προγραμματισμού Έλλειψη μεταφερσιμότητας Μικρές ομάδες χρηστών ανά γλώσσα/διεπαφή Εργαλεία των 90s: Intel ΝΧ, IBM EUI, IBM CCL, PARMACS, OCCAM, PVM κ.ά. Το MPI προέκυψε από μια προσπάθεια συγκέντρωσης και τυποποίησης των καλύτερων πρακτικών από τα ήδη υπάρχοντα εργαλεία 8 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Σχεδιαστικές απαιτήσεις Το MPI αναπτύχθηκε ως πρότυπο με συγκεκριμένα σχεδιαστικές απαιτήσεις: Βασικές λειτουργίες ανταλλαγής μηνυμάτων και σχετικές λειτουργικότητες (π.χ. συλλογική επικοινωνία) Συνδρομή στην ανάπυτυξη βιβλιοθηκών Υψηλή επίδοση στα υπάρχοντα και μελλοντικά συστήματα Κλιμακώσιμος σχεδιασμός Υποστήριξη για C και Fortran 9 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI MPI-1 To MPI-1 προτάθηκε από το MPI forum το 1994 και όριζε: Point-to-point επικοινωνία MPI_Send, MPI_Recv, MPI_Rsend, MPI_Bsend, MPI_Ssend, MPI_Isend, MPI_Irecv, MPI_Wait, MPI_Waitall, MPI_Probe... Blocking collectives MPI_Barrier, MPI_Bcast, MPI_Gather, MPI_Scatter, MPI_Reduce, MPI_Allreduce, MPI_Alltoall... Static communicators και groups Τοπολογίες διεργασιών Καρτεσιανή τοπολογία, Τοπολογία γράφου Datatypes (όχι όλα) MPI_Type_struct, MPI_Type_contiguous, MPI_Type_vector, MPI_Type_indexed Διεπαφή για profiling 10 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI MPI-2 Το MPI-2 (MPI-2.0 το 1997, MPI-2.2 το 2009!) εισήγαγε πολλά νέα στοιχεία στο MPI: Παράλληλο I/O Κλιμακωσιμότητα εφαρμογών που απαιτούν I/O, περιορισμοί του υλικού, checkpointing Δυναμική διαχείριση διεργασιών (Dynamic Process Management) Ανοχή σε σφάλματα (fault-tolerance) One-sided επικοινωνία (RMA - Remote Memory Access) Διαφορετικό προγραμματιστικό μοντέλο - πλέον συμβατό με το σύγχρονο hardware 11 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O Ανάγκη για παράλληλο I/O Οι παράλληλες εφαρμογές εκτελούν I/O για δύο βασικούς λόγους: 1. Ανάγνωση των αρχικών συνθηκών/δεδομένων 2. Εγγραφή αριθμητικών αποτελεσμάτων των προσομοιώσεων Σειριακή ανάγνωση: Μία διεργασία διαβάζει τα αρχικά δεδομένα και τα μοιράζει στις υπόλοιπες διεργασίες Σειριακή εγγραφή: Μία διεργασία συγκεντρώνει τα αποτελέσματα από τις διεργασίες και τα αποθηκεύει σε αρχείο Σπάνια τα δεδομένα χωράνε στη μνήμη μίας διεργασίας! 12 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O Σειριακό I/O Και bottleneck! 13 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O Παράλληλο I/O Πολλαπλές διεργασίες διαβάζουν ή γράφουν παράλληλα από/σε ένα αρχείο 14 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O Παράλληλο I/O με χρήση MPI Απαραίτητοι μηχανισμοί για παράλληλο I/O: collective operations, τύποι δεδομένων για μη συνεχόμενα δεδομένα στη μνήμη/σε αρχείο Αρκετά όμοιοι μ αυτούς που παρέχει το MPI για την επικοινωνία Από την πλευρά του συστήματος: παράλληλο σύστημα αρχείων και υλικό που να επιτρέπει παράλληλες προσβάσεις 15 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O So ware/harware stack Εφαρμογή Βιβλιοθήκη I/O υψηλού επιπέδου (π.χ. HDF5, netcdf) MPI-I/O (π.χ. ROMIO) Παράλληλο Σύστημα Αρχείων (π.χ. GPFS, Lustre). Υλικό 16 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI I/O Βασικές λειτουργίες Παράλληλο άνοιγμα αρχείου με MPI_File_open και τα σχετικά modes Παράλληλη ανάγνωση αρχείου με MPI_File_seek και MPI_File_read ή MPI_File_read_at Παράλληλη εγγραφή αρχείου με MPI_File_set_view και MPI_File_write ή MPI_File_write_at Παράλληλο κλείσιμο αρχείου με MPI_File_close 17 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δυναμική διαχείριση διεργασιών Η δυναμική διαχείριση διεργασιών επιτρέπει: Την προσθήκη διεργασιών σε κάποια δουλειά που τρέχει ήδη Σε εφαρμογές που τις χρειάζονται π.χ. σε έναν branch-and-bound αλγόριθμο Όταν νέοι πόροι γίνονται διαθέσιμοι Σε παράλληλο προγραμματισμό τύπου master-slave Τη συνένωση εφαρμογών που τρέχουν ξεχωριστά Client-server, peer-to-peer κλπ Τη διαχείριση σφαλμάτων Αν μια διεργασία τερματίσει απρόοπτα Αν ένας κόμβος/ένα switch του δικτύου παρουσιάσει βλάβη 18 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δημιουργία νέων διεργασιών MPI job. MPI_COMM_WORLD 19 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δημιουργία νέων διεργασιών MPI job. MPI_COMM_WORLD MPI_Comm_spawn (και MPI_Comm_spaw_multiple) 19 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δημιουργία νέων διεργασιών MPI job MPI_Init(). MPI_COMM_WORLD MPI_Comm_spawn (και MPI_Comm_spaw_multiple) 19 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δημιουργία νέων διεργασιών MPI job Child MPI job Intercommunicator. MPI_COMM_WORLD MPI_COMM_WORLD MPI_Comm_spawn (και MPI_Comm_spaw_multiple) 19 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Δημιουργία νέων διεργασιών MPI job Child MPI job. Intercommunicator MPI_COMM_WORLD MPI_COMM_WORLD MPI_Comm_spawn (και MPI_Comm_spaw_multiple) MPI_Comm_get_parent 19 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Επικοινωνία στη δυναμική διαχείριση διεργασιών Οι διεργασίες πολλαπλών συνδεδεμένων MPI εργασιών επικοινωνούν μέσω συναρτήσεων του MPI πάνω από τον intercommunicator O intercommunicator έχει μέγεθος MPI_UNIVERSE_SIZE Οι διεργασίες παίρνουν αναγνωριστικά από 0 έως MPI_UNIVERSE_SIZE Εκτός από τη μέθοδο που είδαμε (MPI_Comm_spawn), παρέχονται και συναρτήσεις τύπου server-client για την επικοινωνία διαφορετικών εργασιών MPI Server-side: MPI_Open_port, MPI_Comm_accept, MPI_Close_port Client-side: MPI_Comm_connect 20 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Point-to-point vs One-sided Στην point-to-point επικοινωνία απαιτείται διμερής γνώση Οι δύο διεργασίες πρέπει να ορίζουν ποιες θέσεις μνήμης τροποποιούνται Οι δύο διεργασίες πρέπει να ορίζουν πότε μπορεί να συμβεί η τροποποίηση Send και Recv Στην one-sided επικοινωνία η γνώση είναι μονομερής Μόνο μία διεργασία ορίζει από πού προέρχονται και πού καταλήγουν τα δεδομένα Αυτή η διεργασία κάνει πρόσβαση σε απομακρυσμένο χώρο διευθύνσεων (remote memory access) Διαισθητικά πιο κοντά σε μοντέλο κοινού χώρου διευθύνσεων Put ή Get One-sided Point-to-point P0 store send P1 recv load P0 fence put fence P1 fence fence load ή P0 store fence P1 fence get 21 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Πρόσβαση στην απομακρυσμένη μνήμη στο MPI P0 P1 Get P2. P3 Put Τοπική μνήμη Παράθυρο 22 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Βασικές συναρτήσεις για one-sided επικοινωνία MPI_Win_create Η διεργασία ορίζει ένα παράθυρο στη μνήμη της το οποίο χρησιμοποιείται από τις άλλες διεργασίες του communicator για one-sided επικοινωνία Καλείται συλλογικά από τις διεργασίες του communicator Δημιουργείται ένα αντικείμενο window MPI_Win_free Το αντικείμενο window αποδεσμεύεται MPI_Put Η διεργασία μεταφέρει δεδομένα από την τοπική της μνήμη σε απομακρυσμένη μνήμη MPI_Get Η διεργασία μεταφέρει δεδομένα από απομακρυσμένη μνήμη στην τοπική της μνήμη MPI_Accumulate Η διεργασία ανανεώνει δεδομένα σε απομακρυσμένη μνήμη MPI_Win_fence Αναμονή για ολοκλήρωση όλων των RMA λειτουργιών 23 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Σύνοψη του Remote Memory Access Πλεονεκτήματα Επιτρέπει πολλαπλές μεταφορές δεδομένων χωρίς συγχρονισμό Δεν απαιτεί matching στις ουρές των μηνυμάτων Βοηθάει στον προγραμματισμό όταν η επικοινωνία δεν είναι συμμετρική Στα σύγχρονα δίκτυα διασύνδεσης μπορεί να είναι πολύ πιο γρήγορη από την point-to-point επικοινωνία Μειονεκτήματα Αν δεν υπάρχει υποστήριξη από το υλικό, δεν επιτυγχάνει υψηλή επίδοση Στις περισσότερες περιπτώσεις απαιτείται συγχρονισμός, που δεν κλιμακώνει Οι προγραμματιστές θεωρούν τις one-sided συναρτήσεις του MPI περίπλοκες και μη αποδοτικές 24 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI MPI-3 Το MPI-3 προτάθηκε το 2012 (MPI-3.1 τον Ιούνιο του 2015), προσπαθώντας να λύσει νέα προβλήματα: Non-blocking collectives Η συλλογική επικοινωνία θα καταναλώνει σημαντικό χρόνο των εφαρμογών σε συστήματα μεγαλύτερης κλίμακας Η ασύγχρονη συλλογική επικοινωνία βοηθά στο να κρυφτεί μέρος αυτού του χρόνου Αραιή συλλογική επικοινωνία (blocking και non-blocking) Καλύτερη κλιμάκωση- ευκολότερος προγραμματισμός εφαρμογών που επικοινωνούν συλλογικά με γείτονες (π.χ. Jacobi!) Σημαντικές επεκτάσεις στην one-sided επικοινωνία Για καλύτερη επίδοση σε υβριδικά συστήματα Για διαχείριση παράλληλων δομών δεδομένων Υποστήριξη για εργαλεία επίδοσης 25 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Non-blocking collectives Στην καλύτερη περίπτωση η συλλογική επικοινωνία κλιμακώνει λογαριθμικά Η ασύγχρονη συλλογική επικοινωνία επιτρέπει επικαλύψεις (overlapping) Τα non-blocking collectives του MPI-3 προέρχονται από την εμπειρία εφαρμογών του πραγματικού κόσμου MPI_Ialltoall - FFT MPI_Iallreduce - Krylov methods (Conjugate Gradient) MPI_Iscatter, MPI_Igather - stencils... και άλλα, όπως MPI_Ibcast, MPI_Ibarrier 26 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Neighborhood collectives Σε πολλές εφαρμογές οι διεργασίες επικοινωνούν επαναληπτικά με συγκεκριμένους γείτονες Τα neighborhood collectives δίνουν τη δυνατότητα στον προγραμματιστή Να ορίσει γράφους γειτόνων (MPI_Dist_graph_neighbors) Να αντικαταστήσει την point-to-point επικοινωνία με μία γραμμή MPI_Neighbor_allgather, MPI_Neighbor_allgatherv (και σε non-blocking) MPI_Neighbor_alltoall, MPI_Neighbor_alltoallv (και σε non-blocking) 27 11/2015 Συστήματα Παράλληλης Επεξεργασίας
MPI Λειτουργίες για δομές δεδομένων Η one-sided επικοινωνία του MPI-2 βοηθά στη διατήρηση κατανεμημένων δομών δεδομένων Το MPI-3 προσθέτει λειτουργίες που σχετίζονται με το συγχρονισμό Non-blocking locks (κάποια ήδη από το MPI-2) MPI_Win_lock, MPI_Win_unlock, MPI_Win_lock_all, MPI_Win_unlock_all κ.ά. Atomic operations MPI_Fetch_and_op, MPI_Compare_and_swap και άλλα 28 11/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 MPI 3 UPC 29 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC PGAS Languages Global Address Space: ένα thread μπορεί απευθείας να διαβάσει/γράψει απομακρυσμένα δεδομένα Κρύβει τη διάκριση μεταξύ κοινής/κατανεμημένης μνήμης Partitioned Global Address Space (PGAS): τα δεδομένα επισημαίνονται ως local ή global Δεν κρύβει τη διάκριση: κρίσιμο για locality και scaling Χαρακτηριστικά των PGAS γλωσσών: Global address space όπως στα threads (programmability) SPMD παραλληλισμός όπως στο MPI (performance) Διάκριση local/global data (performance) Φιλοσοφία αντίστοιχη με την one-sided επικοινωνία στο MPI 30 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Εισαγωγή Unified Parallel C (UPC): Παράλληλη επέκταση της ANSI C Γλώσσα προγραμματισμού κατανεμημένης κοινής μνήμης Έχει τη φιλοσοφία της C Προγραμματισμός κοντά στο hardware για performance, αλλά με τα προβλήματα της C Όμοια σύνταξη και semantics Ιστορία Ξεκίνησε το 1999 από το IDA, το UCB και το LLNL UPC consortium: ARSC, Compaq, CSC, Cray Inc., Etnus, GMU, HP, IDA CCS, Intrepid Technologies, LBNL, LLNL, MTU, NSA, SGI, Sun Microsystems, UCB, U. Florida, US DOD PI η Kathy Yelick από το UCB Σήμερα: Berkeley UPC, GNU UPC, IBM XL UPC Compilers, Cray UPC, HP UPC κ.ά. 31 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Μοντέλο εκτέλεσης Μοντέλο εκτέλεσης: reads δουλεύουν ανεξάρτητα σε SPMD μοντέλο Το πλήθος των threads καθορίζεται στο χρόνο μεταγλώττισης ή στο χρόνο εκτέλεσης μεταβλητή προγράμματος για πλήθος threads: THREADS μεταβλητή προγράμματος για thread id: MYTHREAD upc_barrier: Συγχρονισμός για όλα τα threads (all wait) Δύο επιλογές μεταγλώττισης: Στατικά threads H μεταβλητή THREADS καθορίζεται από το χρήστη στο χρόνο μεταγλώττισης Το πρόγραμμα μπορεί να χρησιμοποιήσει τη μεταβλητή THREADS ως σταθερά Δυναμικά threads O μεταγλωττισμένος κώδικας μπορεί να τρέξει με οποιοδήποτε αριθμό από threads 32 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Shared vs Private variables Private variables:δεσμεύονται στον private χώρο μνήμης του thread, όπως στη C Shared variables: δεσμεύονται μία φορα, με το thread 0 shared int ours; /*use shared variables sparingly*/ int mine; Οι shared μεταβλητές δεν μπορούν να έχουν dynamic lifetime: σε συναρτήσεις μπορούν να χρησιμοποιηθούν μόνο αν δηλωθούν ως static read0 read1 readn Global Address Space ours: mine: mine:....... mine: Shared Private 33 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Pointers in UPC Πού Στη UPC υπάρχουν 4 τύποι pointers, ανάλογα με το πού βρίσκονται και το πού δείχνουν. βρίσκεται ο pointer Πού δείχνει ο pointer Local Shared Private p1 p2 Shared p3 p4. int * p1; /*private pointer to local memory*/ shared int * p2; /*private pointer to shared space*/ int * shared p3; /*shared pointer to local memory*/ shared int * shared p4; /*shared pointer. to shared space*/ int * p1: γρήγορος, χρησιμοποιείται για πρόσβαση σε τοπικά δεδομένα σε κώδικα που εκτελεί τοπική δουλειά shared int * p2: χρησιμοποιείται για πρόσβαση σε απομακρυσμένα δεδομένα, αργός γιατί μπορεί να περιλαμβάνει communication int * shared p3: δεν προτείνεται shared int * shared p4: χρησιμοποιείται για μοιραζόμενες δομές δεδομένων 34 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Shared arrays Οι scalar μεταβλητές που είναι shared αποθηκεύονται στο χώρο μνήμης του thread 0 Οι πίνακες που είναι shared κατανέμονται μεταξύ των threads (default: κυκλική ανάθεση) shared int x[threads]; /*1 element per thread*/ shared int y[3][threads]; /*3 elements per thread*/ shared int z[3][3]; /*2-3 elements per thread*/ Για διαφορετική ανάθεση, χρησιμοποιούνται οι layout specifiers: shared int x[n]: κυκλική ανάθεση shared int [*] x[n]: ανάθεση κατά blocks shared int [0] x[n]: όλος ο πίνακας στο thread 0 shared int [b1][b2]...[bn] x[n]: συγκεκριμένο block size (b1,b2,...,bn) για κάθε thread 35 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Κατανομή εργασίας - upc_forall upc_forall(init; test; loop; affinity) statement; Επανάληψη πάνω σε όλα τα στοιχεία - Δουλειά στα στοιχεία που ανήκουν στον επεξεργαστή Ο προγραμματιστής ορίζει ότι οι επαναλήψεις είναι ανεξάρτητες Απροσδιόριστο αν υπάρχουν εξαρτήσεις μεταξύ των threads Παράδειγμα: Πρόσθεση Διανυσμάτων. #define N 100*THREADS shared int v1[n], v2[n], sum[n]; /*default:cyclic distribution*/ void main() { int i; upc_forall( i=0; i<n; i++; i) sum[i]=v1[i]+v2[i];.} 36 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Collective communication Όπως και το MPI, και η UPC υποστηρίζει collective communication. Collectives για υπολογισμούς TYPE bupc_allv_reduce(type, TYPE value, int rootthread, upc_op_t reductionop) TYPE bupc_allv_reduce_all(type, TYPE value, upc_op_t reductionop) Collectives για μεταφορά δεδομένων TYPE bupc_allv_broadcast(type, TYPE value, int rootthread) TYPE bupc_allv_scatter(type, int rootthread, TYPE *rootsrcarray) TYPE bupc_allv_gather(type, TYPE value, int rootthread, TYPE *rootdestarray) TYPE bupc_allv_gather_all(type, TYPE value, TYPE *destarray) Άλλες εκδόσεις της UPC υποστηρίζουν αυτά και πολλά άλλα collectives (με διαφορετική σύνταξη). 37 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Άλλα χαρακτηριστικά. Dynamic Memory Allocation. shared void * upc_global_alloc(size_t nblocks, size_t nbytes) Καλείται από ένα thread - Ένα thread δεσμεύει shared μνήμη shared void * upc_all_alloc(size_t nblocks, size_t nbytes) Καλείται από όλα τα threads - Επιστρέφει τον ίδιο shared pointer. void upc_free(shared void *ptr). Global synchronization.. upc_barrier Blocking barrier upc_notify, upc_wait Non-blocking barrier 38 11/2015 Συστήματα Παράλληλης Επεξεργασίας. Locks. upc_lock_t *upc_all_lock_alloc(void), *upc_global_lock_alloc(void). void upc_lock(upc_lock_t *l), void upc_unlock(upc_lock_t *l) void upc_lock_free(upc_lock_t *ptr)
UPC Παράδειγμα: Jacobi-1D - Απλή αλλά μη αποδοτική εκδοχή shared[*] double u_old[n], u[n]; /*block layout*/ void jacobi_sweeps(int T) { int i, t; upc_barrier; for (t=0; t<t; ++t) { upc_forall(i=1; i<n-1; ++i; &(u[i])) u[i]=(u_old[i-1]+u_old[i+1])/2; upc_barrier; upc_forall(i=0; i<n; ++i; &(u[i])) u_old[i]=u[i]; upc_barrier; } } 39 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Παράδειγμα: Jacobi-1D - Λιγότερο απλή αλλά πιο αποδοτική εκδοχή shared double u_bound[2][threads]; /*global - for ghost cells*/ double u_old[n_local+2], u[n_local+2]; /*local*/ void jacobi_sweeps(int T) { int i, t; for (t=0; t<t; ++t) { if (MYTHREAD>0) u_bound[0][mythread-1]=u_old[1]; if (MYTHREAD<THREADS) u_bound[1][mythread+1]=u_old[n_local]; upc_barrier; u_old[0]=u_bound[0][mythread]; u_old[n_local+1]=u_bound[1][mythread]; for(i=1; i<n_local+1; ++i) u[i]=(u_old[i-1]+u_old[i+1])/2; upc_barrier; upc(i=0; i<n_local+1; ++i) u_old[i]=u[i]; } } 40 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation. UPC code 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator Translator Generated C code 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator Translator Generated C code UPC Runtime System 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator Translator Generated C code UPC Runtime System GASNet Communication System 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator network-independent Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware language-independent 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC. code UPC-to-C translator platform-independent network-independent Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware compiler-independent language-independent 41 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC UPC-to-C translator Μεταγλώττιση σε 2 φάσεις Φάση 1: Μετάφραση της UPC σε C, όπου τα features της UPC μεταφράζονται σε κλήσεις στο runtime Φάση 2: Μεταγλώττιση του κώδικα με τον C compiler του συστήματος και σύνδεση με το runtime system 42 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Runtime system Το runtime system της UPC περιλαμβάνει λειτουργίες όπως: Δημιουργία και διαχείριση των threads Διαχείριση μνήμης Προσβάσεις στη μνήμη (τοπική ή απομακρυσμένη) Συγχρονισμό Polling στο δίκτυο 43 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC One-sided Communication Η UPC χρησιμοποιεί one-sided επικοινωνία: Message = address + data Two-sided: Message = message id + data Δύο βασικά blocking memory-to-memory operations: 1. put (upc_memput): ανανέωση των shared δεδομένων με δεδομένα από τον ιδιωτικό χώρο μνήμης του thread 2. get (upc_memget): αντιγραφή shared δεδομένων στον ιδιωτικό χώρο μνήμης ενός thread Πλεονέκτημα: αν το network interface υποστηρίζει RDMA, το get/put δεν κάνει interrupt στη CPU, ούτε απαιτεί buffering 44 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Translator+Runtime: Βελτιστοποιήσεις στον παραγόμενο κώδικα Στη UPC, ο προγραμματιστής δεν ορίζει explicitly την ανταλλαγή δεδομένων Το runtime αναλαμβάνει να πραγματοποιήσει την ανταλλαγή δεδομένων με one-sided communication Ο UPC-to-C translator ενορχηστρώνει τον κώδικα με τις κατάλληλες κλήσεις στο runtime Βασικά optimizations στο translation/compilation: 1. Redundancy elimination: Περιττά accesses στη UPC ενδεχομένως σημαίνουν επικοινωνία πάνω από το δίκτυο 2. Split-phase communication: Διαχωρισμός του communication init και του communication sync για computation/communication overlapping και message pipelining 3. Message coalescing: Πολλά put/get με μικρό μεγέθος μηνύματος συνενώνονται σε μεγάλα μηνύματα 45 11/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC GASNet Το GASNet είναι σύστημα επικοινωνίας σχεδιασμένο για PGAS γλώσσες Υποστηρίζει πολλά δίκτυα διασύνδεσης υψηλής επίδοσης (Infiniband, SGI Altix, Cray, Quadrics, Ethernet-UDP) To GASNet core API παρέχει βασικά network primitives Η υλοποίηση βασίζεται σε active messages. Active messages: κάθε μήνυμα έχει στο header του τη διεύθυνση ενός user-space handler, που εκτελείται με την άφιξη του μηνύματος, με στόχο να απελευθερωθεί. γρήγορα το δίκτυο και να μην μπλοκάρει η CPU Το GASNet extended API παρέχει λειτουργίες put/get, collectives, split-phase barriers κ.α. 46 11/2015 Συστήματα Παράλληλης Επεξεργασίας