Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Παράλληλος προγραμματισμός: Σχεδίαση παράλληλων προγραμμάτων 9 ο Εξάμηνο
Σχεδιασμός παράλληλων προγραμμάτων Δεν υπάρχει αυστηρά ορισμένη διαδικασία για το σχεδιασμό και την υλοποίηση παράλληλων προγραμμάτων It s more art than science Μετρικές αξιολόγησης: Επίδοση του παραγόμενου κώδικα Επιτάχυνση Αποδοτικότητα Κλιμακωσιμότητα Παραγωγικότητα (code productivity) Χαμηλός χρόνος υλοποίησης Μεταφερσιμότητα (portability) Ευκολία στη συντήρηση (maintainability) 2
4 βασικά στάδια (όχι τελείως ανεξάρτητα) Στάδιο 1: Κατανομή υπολογισμών και δεδομένων Στάδια σχεδιασμού Στάδιο 2: Σχεδιασμός αλληλεπίδρασης ανάμεσα στα tasks Στάδιο 3: Απεικόνισητωνtasks σεδιεργασίες (ή threads) Στάδιο 4: Ενορχήστρωση της επικοινωνίας ή/και του συγχρονισμού Σημείωση: Πολλέςαπότιςεπιλογέςσεκάθεστάδιοεξαρτώνται στάδιο εξαρτώνται από την τελική πλατφόρμα εκτέλεσης 3
Στάδιο 1: Κατανομή υπολογισμών και δεδομένων Στόχος: κατανομή των υπολογισμών και των δεδομένων σε επεξεργαστικά στοιχεία Τι να μοιράσω πρώτα; Υπολογισμούς ή δεδομένα; Προσέγγιση παραλληλοποίησης task centric: πρώτα μοιράζονται οι υπολογισμοί και βάσει αυτού τα δεδομένα data centric: πρώτα μοιράζονται τα δεδομένα, και βάσει αυτού οι υπολογισμοί Τελικά θα προκύψουν tasks και κατανομή δεδομένων Παράδειγμα: Πολλαπλασιασμός πινάκων (C = A B) task centric: διαμοιρασμός των υπολογισμών με βάση τα γινόμενα διανυσμάτων, δηλ. 1 task = ένα γινόμενο διανυσμάτων data centric: διαμοιρασμός των υπολογισμών ανά στοιχείο του πίνακα C, δηλ. 1 task = πράξεις που χρειάζονται για τον υπολογισμό ενός στοιχείου C ij του πίνακα C Ειδική περίπτωση της task centric προσέγγισης είναι η function centric: η κατανομή γίνεται με βάση τις συναρτήσεις (διαφορετικές λειτουργίες) function centric: διαμοιρασμός των υπολογισμών ανά πράξη: 1 task = πολλαπλασιαμός, 1 task = πρόσθεση 4
Επιλογή στρατηγικής ανάλογα με τον αλγόριθμο Η task centric προσέγγιση είναι η πιο γενική Στάδιο 1: Κατανομή υπολογισμών και δεδομένων Οι task centric και data centric μπορεί να οδηγήσουν σε ακριβώς την ίδια κατανομή Απαιτήσεις: Αποδοτικότητα Μεγιστοποίηση παραλληλίας Ελαχιστοποίηση επιβαρύνσεων λόγω διαχείρισης tasks, συγχρονισμού, επικοινωνίας Ισοκατανομή φορτίου Απλότητα Ευελιξία (ανεξαρτησία από απαιτήσεις υλοποίησης) 5
Αναλογία: παρασκευή πίτσας Μάγειρας Processing element Υλικά (ζύμη, σάλτσα, topping) data Στόχος: παραλληλοποίηση της παρασκευής Ν ταψιών πίτσας Υπόθεση: Συνεργάζονται >1 μάγειρες task centric προσέγγιση: «μοιράζω τη δουλειά» 1 task = παρασκευή 1 ταψιού πίτσας data centric προσέγγιση: «μοιράζω τα δεδομένα (υλικά)» η κατανομή της δουλειάς προκύπτει σαν φυσικό επακόλουθο του διαμοιρασμού των δεδομένων μοιράζω τα υλικά σε τμήματα (σε Κ μέρη / ανά μάγειρα / ανά πίτσα, θα αποφασιστεί αργότερα) function centric προσέγγιση: διαχωρίζω τις διαφορετικές δουλειές παρασκευή ζύμης, παρασκευή σάλτσας, προετοιμασία topping, άπλωμα ζύμης, τοποθέτηση σάλτσας, τοποθέτηση topping 6
Rule of thumb Αλγόριθμοι σε κανονικές δομές δεδομένων (π.χ. regular computational grids, αλγεβρικοί πίνακες) ευνοούν τη data centric κατανομή: Πολλαπλασιασμός πινάκων (γενικά βασικές αλγεβρικές ρουτίνες) Επίλυση γραμμικών συστημάτων Stencil computations Όταν μπορεί να εφαρμοστεί, η data centric προσέγγιση οδηγεί σε κομψές λύσεις: δοκιμάζουμε πρώτα την data centric και αν δεν πετύχει, καταφεύγουμε στην task centric 7
Rule of thumb H task centric προσέγγιση αποτελεί λύση για πιο δυναμικούς αλγορίθμους σε ακανόνιστες δομές δεδομένων (irregular data structures) Αλγόριθμοι σε λίστες, δέντρα, γράφους, κλπ Αναδρομικοί αλγόριθμοι Event based εφαρμογές 8
Παράδειγμα: Εξίσωση θερμότητας Αλγόριθμος του Jacobi (2 διάστατο πλέγμα Χ Υ) A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1]) Data centric Task centric Μοιράζουμε τα δεδομένα ανά σημείο / 1 task = υπολογισμός θερμότητας για κάθε γραμμή / στήλη / μπλοκ σημείο του χωρίου Κάθε task αναλαμβάνει να υπολογίσει την τιμή σε κάθε διαμοιρασμένο δεδομένο 1 task = υπολογισμός θερμότητας για κάθε χρονικό βήμα 1 task = υπολογισμός θερμότητας για μία γραμμή / στήλη / block του δισδιάστατου πλέγματος για όλες τις χρονικές στιγμές 1 task = υπολογισμός θερμότητας για μία γραμμή / στήλη / block του δισδιάστατου πλέγματος για μία χρονική στιγμή Κατανομή δεδομένων: Κάθε task κατέχει (owns) τα δεδομένα που γράφει 9
Κατανομή δεδομένων Τα δεδομένα του προβλήματος μπορούν να κατανεμηθούν ως: Μοιραζόμενα δεδομένα (shared data): Μπορεί να υποστηριχθεί μόνο από προγραμματιστικά μοντέλα κοινού χώρου διευθύνσεων Αποτελεί ένα πολύ βολικό τρόπο «κατανομής» Χρειάζεται ιδιαίτερη πρόνοια όταν τα δεδομένα εγγράφονται από διαφορετικά tasks Κατανεμημένα δεδομένα (distributed data): ) Τα δεδομένα διαμοιράζονται ανάμεσα στα tasks Αποτελεί τη βασική προσέγγιση στα προγραμματιστικά μοντέλα ανταλλαγής μηνυμάτων Επιβάλλει επιπλέον προγραμματιστικό κόστος Αντιγραμμένα δεδομένα (replicated data): Για αντιγραφή μικρών read only δομών δεδομένων Για αντιγραφή υπολογισμών 10
Κατανομή κανονικών δομών 1 dimensional 2 dimensional 11
Ανάγκη για αλληλεπίδραση: Στάδιο 2: Σχεδιασμός αλληλεπίδρασης ης ανάμεσα στα tasks Κοινά δεδομένα προσπελαύνονται από διαφορετικά tasks Τουλάχιστον μία πρόσβαση είναι εγγραφή Race condition: Το αποτέλεσμα της (παράλληλης) εκτέλεσης εξαρτάται από τη σειρά με την οποία τα tasks προσπελαύνουν τα κοινά δεδομένα Π.χ. producer consumer (counter++, counter ) critical section Εξάρτηση ανάμεσα σε tasks: Η σημασιολογικά ορθή εκτέλεση απαιτεί συγκεκριμένα σειρά πρόσβασης στα δεδομένα ordering 12
Εξαρτήσεις Εξαρτήσεις δεδομένων υπάρχουν ήδη από το σειριακό πρόγραμμα Εξάρτηση ηυπάρχει όταν 2 εντολές αναφέρονται στα ίδια δεδομένα (θέση η μνήμης) 4 είδη εξαρτήσεων Read After Write Wi (RAW) ή true dependenced Write After Read (WAR) ή anti dependence Write After Write (WAW) )ήή output dependence Read After Read (not really a dependence) Η παράλληλη εκτέλεση πρέπει να σεβαστεί τις εξαρτήσεις του προβλήματος Η κατανομή των δεδομένων στα tasks δημιουργεί κατά κανόνα εξαρτήσεις ανάμεσα στα tasks (π.χ. το task1 πρέπει να διαβάσει δεδομένα που παράγει το task2) 13
Ή απλά task graph Κορυφές: tasks Label κορυφής: κόστος υπολογισμού του task Ακμές: εξαρτήσεις ανάμεσα στα tasks Γράφος εξαρτήσεων (task dependence graph) Βάρος ακμής: όγκος δεδομένων που πρέπει να μεταφερθούν (στην περίπτωση της επικοινωνίας) 14
Εξαρτήσεις στην εξίσωση θερμότητας 1 task = υπολογισμός θερμότητας για κάθε σημείο του χωρίου A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1]) 15
Εξαρτήσεις στην εξίσωση θερμότητας 1 task = υπολογισμός θερμότητας για κάθε χρονικό βήμα Δεν υπάρχουν ταυτόχρονα tasks! A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1]) 16
Εξαρτήσεις στην εξίσωση θερμότητας 1 task = υπολογισμός θερμότητας για μία γραμμή του δισδιάστατου πλέγματος για όλες τις χρονικές στιγμές Δεν υπάρχει έγκυρη παράλληλη εκτέλεση! A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1]) 17
Εξαρτήσεις στην εξίσωση θερμότητας 1 task = υπολογισμός θερμότητας για μία γραμμή του δισδιάστατου πλέγματος για μία χρονική στιγμή A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1]) 18
Στάδιο 3: Απεικόνιση των tasks σε διεργασίες (ή threads) Κατάλληλη ομαδοποίηση tasks μπορεί να οδηγήσει σε μείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισμού επικοινωνίας) 19
Ομαδοποίηση tasks Κατάλληλη ομαδοποίηση tasks μπορεί να οδηγήσει σε μείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισμού επικοινωνίας) 20
Ομαδοποίηση tasks Κατάλληλη ομαδοποίηση tasks μπορεί να οδηγήσει σε μείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισμού επικοινωνίας) 21
Ομαδοποίηση tasks Η ομαδοποίηση των tasks κάνει τη συνέχεια της υλοποίησης πιο ευέλικτη (π.χ. ανεξάρτητη από το μέγεθος του προβλήματος) Π.χ. στην εξίσωση διάχυσης η ομαδοποίηση tasks σε δύο διαστάσεις του χωρικού πλέγματος παραμετρικά (π.χ. B 1 B 2 αρχικά tasks δημιουργούν ένα νέο task) παρέχει ευελιξία στη συνέχεια της υλοποίησης 22
Στατική απεικόνιση: Στατική vs. Δυναμική απεικόνιση tasks Διαμοιρασμός των tasks σε threads πριν την έναρξη της εκτέλεσης Κατάλληλη στρατηγική για εφαρμογές με: ομοιόμορφη και γνωστή εξαρχής κατανομή φορτίου ανομοιόμορφη αλλά προβλέψιμη κατανομή φορτίου Πλεονεκτήματα : Απλή στην υλοποίηση Καλή επίδοση για «κανονικές εφαρμογές» Μηδενικό overhead Μειονεκτήματα: Κακή επίδοση για δυναμικές και ακανόνιστες εφαρμογές 23
Δυναμική απεικόνιση: Στατική vs. Δυναμική απεικόνιση tasks Διαμοιρασμός των tasks σε threads κατά την εκτέλεση Κατάλληλη στρατηγική για εφαρμογές με: μη προβλέψιμο φορτίο δυναμικά δημιουργούμενα tasks Πλεονεκτήματα: Εξισορρόπηση φορτίου σε δυναμικές και ακανόνιστες εφαρμογές Μειονεκτήματα: Δύσκολη στην υλοποίηση (συνήθως το αναλαμβάνει το run time σύστημα) Μπορεί να δημιουργήσει bottleneck σε περίπτωση υλοποίησης με ένα κεντρικό scheduling thread (απαιτούνται κατανεμημένοι αλγόριθμοι) 24
data centric, στατική απεικόνιση 1-dim 2-dim (block) sequential cyclic sequential cyclic 25
//LU decomposition kernel for(k=0; k<n-1; k++) for(i=k+1; i<n; i++){ L[i] = A[i][k] / A[k][k]; for(j=k+1; j<n; j++) A[i][j]=A[i][j]-L[i]*A[j][i]; } Παράδειγμα: Επιλογή απεικόνισης για LU και stencil //stencil for (t=1; t<t; t++){ for (i=1; i<x; i++) for (j=1; j<y; j++) A[t][i][j] = 0.2*(A[t-1][i][j] + A[t-1][i-1][j] + A[t-1][i+1][j] + A[t-1][i][j-1] + A[t-1][i][j]); } 26
Στάδιο 4: Ενορχήστρωση της επικοινωνίας ή/και του συγχρονισμού Η κατανομή των υπολογισμών και των δεδομένων δημιουργεί ανάγκες για επικοινωνία και συγχρονισμό Επικοινωνία: Κατανεμημένα δεδομένα 1 task χρειάζεται να διαβάσει δεδομένα που κατέχει ένα άλλο task Σημείο προς σημείο και συλλογική Συγχρονισμός: Διατήρηση των εξαρτήσεων: σειριοποίηση μεταξύ tasks Αμοιβαίος αποκλεισμός: ελεγχόμενη πρόσβαση σε shared δεδομένα Τυπικά patterns συγχρονισμού: critical section ordering barrier 27
Στάδιο 4: Ενορχήστρωση της επικοινωνίας ή/και του συγχρονισμού Συχνή επικοινωνία / συγχρονισμός μπορούν να «σκοτώσουν» την επίδοση ενός παράλληλου προγράμματος Βελτιστοποίηση επικοινωνίας Κατάλληλη κατανομή δεδομένων μείωση αναγκών επικοινωνίας Επικάλυψη υπολογισμών επικοινωνίας Ζητήματα συγχρονισμού Δύσκολη υλοποίηση ορθά συγχρονισμένων προγραμμάτων Κόστος εκτέλεσης: fine grain vs coarse grain συγχρονισμός Εναλλακτικές προσεγγίσεις: Non blocking data structures Transactional memory 28
Σύνοψη σχεδιασμού παράλληλων προγραμμάτων Δεν υπάρχει ξεκάθαρη μεθοδολογία παραλληλοποίησης προγραμμάτων Δύο σημαντικά βήματα (συχνά όχι σειριακά): Σχεδιασμός Αναζήτηση παραλληληλίας (κατανομή υπολογισμού και δεδομένων σε tasks) Δεν λαμβάνονται ιδιαίτερα υπόψη τα εργαλεία προγραμματισμού και η πλατφόρμα εκτέλεσης Υλοποίηση (επόμενο μάθημα) Έκφραση παραλληλίας Επιλογή προγραμματιστικού μοντέλου και εργαλείων Λαμβάνεται υπόψη η πλατφόρμα εκτέλεσης 2 βασικές προσεγγίσεις σχεδιασμού: task parallelism: κατανέμονται πρώτα οι υπολογισμοί και μετά τα δεδομένα data parallelism: κατανέμονται πρώτα τα δεδομένα και μετά οι υπολογισμοί Σημαντική προσέγγιση: functional parallelism (υποπερίπτωση του task parallelism) Επιλογή προσέγγισης ανάλογα με τα χαρακτηριστικά της εφαρμογής 29