ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2 Πολυπύρηνοι επεξεργαστές, μέρος 2 Αρης Ευθυμίου Πηγές διαφανειών: συνοδευτικές διαφάνειες αγγλικης εκδοσης του βιβλιου
Cache coherence & scalability! Τα πρωτόκολλα snoopy απαιτούν επικοινωνία μεταξύ όλων των κρυφών μνημών για κάθε αστοχία δε χρειάζεται μια κεντρική δομή δεδομένων! Αρχικοί παράλληλοι υπολογιστές είχαν κεντρική μοιραζόμενη μνήμη και χωριστές cache λίγο επιπλέον υλικό για snoopy cache coherence! Μεγάλες απαιτήσεις για ρυθμό μεταφοράς δεδομένων από μνήμη και «εσωτερικό» δίκτυο Processor Processor Processor Processor One or more levels of cache One or more levels of cache One or more levels of cache One or more levels of cache Private caches Shared cache Main memory I/O system 2
Αύξηση bandwidth Multicore MP Multicore MP Multicore MP Multicore MP Memory I/O Memory I/O Memory I/O Memory I/O Interconnection network Memory I/O Memory I/O Memory I/O Memory I/O Multicore MP Multicore MP Multicore MP Multicore MP! Κατανέμοντας τη μνήμη! Εκμετάλευση τοπικότητας αναφορών διαχωρισμός «κίνησης» σε τοπική και απομακρυσμένη! Coherence αν κάθε miss εκπέμπεται σε όλες τις caches, το όφελος είναι μικρό 3
Πρωτόκολλα directory! Το directory κρατάει πληροφορίες για τη κατάσταση κάθε cache block ένας κεντρικός κατάλλογος! Μόνο οι cache που έχουν αντίγραφα ενός block χρειάζεται να συμμετέχουν σε ενέργειες σχετικές με τη συνέπεια του block! Απλή υλοποίηση μία καταχώρηση για κάθε block που βρίσκεται στη μνήμη συνολικά: αριθμός block x αριθμός πυρήνων (cache) 4
Μοναδικό directory = bodleneck?! Αν το directory βρισκόταν σε ένα κόμβο του συστήματος θα ήταν προβληματικό (bodleneck) πολλή κίνηση στο δίκτυο για το κόμβο του directory μεγάλος αποθηκευτικός χώρος σε ένα σημείο! Κατανεμημένο directory διαφορετικά block σε διαφορετικές «φέτες» (slices) του directory οι πληροφορίες για κάθε block βρίσκονται σε ένα σταθερό, γνωστό σημείο Memory Directory Multicore processor + caches I/O Memory Directory Multicore processor + caches I/O Memory Directory Interconnection network Multicore processor + caches I/O Memory Directory Directory Directory Directory Directory Multicore processor + caches Memory I/O Memory I/O Memory I/O Memory I/O Multicore processor + caches Multicore processor + caches Multicore processor + caches Multicore processor + caches I/O 5
Καταστάσεις (state) block Κάθε block στο directory μπορεί να είναι σε κατάσταση:! Shared Ενας ή περισσότεροι πυρήνες έχουν αντίγραφο και η μνήμη είναι ενήμερη! Uncached δεν υπάρχει αντίγραφο σε κανένα πυρήνα! Modified μόνο ένας πυρήνας (owner) έχει αντίγραφο. Η μνήμη δέν έχει τη σωστή τιμή Επιπλέον η καταχώρηση περιλαβάνει τις «ταυτότητες» (αριθμοί) των πυρήνων που έχουν αντίγραφα! Τα παραπάνω είναι τα ελάχιστα στοιχεία 6
! Για καλύτερη απόδοση οι cache επίσης κρατούν στοιχεία για τη κατάσταση κάθε block που έχουν ώστε να μη χρειάζεται να συμβουλεύονται το directory για κάθε ενέργεια αν δεν είναι απαραίτητο! Παρόμοιες καταστάσεις με snoopy Modified, Shared, Invalid! Ορολογία: local node ο πυρήνας/κόμβος που κάνει αίτημα home node ο κόμβος όπου βρίσκονται η μνήμη και το directory μιας διεύθυνσης. Υπολογίζεται από τη διεύθυνση remote node ένας κόμβος που έχει αντίγραφο 7
Μηνύματα 8
Διάγραμμα καταστάσεων Fetch invalidate Data write-back Invalid Send write miss message CPU write CPU read Send read miss message CPU read miss Data write-back; read miss Fetch Data write-back Send invalidate message CPU write hit CPU write miss Invalidate Send write miss message CPU read hit Shared (read only) CPU read miss Read miss Read/write miss περιμένουν απάντηση πριν αλλάξουν κατάσταση Το Invalidate message περιμένει μέχρι όλα τα αντίγραφα να έχουν ακυρωθεί πριν αλλάξει κατάσταση Αντικατάσταση block CPU write hit CPU read hit Modified (read/write) CPU write miss Data write-back Write miss 9
Διάγραμμα καταστάσεων directory Uncached Data value reply; Sharers = {P} Read miss Shared (read only) Data write-back Sharers = {} Data value reply; Sharers = {P} Exclusive (read/write) Write miss Read miss Fetch; data value reply; Sharers = Sharers + {P} Invalidate; Sharers = {P}; data value reply Write miss Fetch/invalidate Data value reply Sharers = {P} Write miss Read miss Data value reply Sharers = Sharers + {P} Το Invalidate message προκαλεί τις ίδιες μεταβολές με write miss συχνά ονομάζεται upgrade miss 10
Απλουστεύσεις Υπαρχουν πολύ σημαντικές απλουστεύσεις! Ολες οι πράξεις στο directory και γίνονται αδιαίρετα (atomic)! Η σειρά των μηνυμάτων δεν αλλάζει!... 11
Memory consistency! Λύνοντας το θέμα της cache coherency δεν είναι αρκετό! Συχνά ένα παράλληλο πρόγραμμα κάνει υποθέσεις για τη σειρά εκτέλεσης πράξεων μνήμης σε διαφορετικές διευθύνσεις Παράδειγμα (αρχικά a=flag=0): Processor 1 Processor 2 a = func(); while (flag==0); flag = 1; print a; Υποθέτουμε ότι αν ο 2 διαβάσει το flag ως 1, θα διαβάσει επίσης την καινούρια τιμή του a Η coherence δεν το εξασφαλίζει αυτό! 12
Είναι πράγματι πρόβλημα;! Μήπως δε γράψαμε καλά τον κώδικα; έπρεπε να βάλουμε κάποιο σαφή συγχρονισμό μεταξύ παραγωγού καταναλωτή; Processor 1 a = func(); Barrier(); Ακόμα υπάρχουν προβλήματα: Processor 2 Barrier(); print a;! Η ρουτίνα Barrier δεν εγγυάται ότι εγγραφές πριν το Barrier θα έχουν φτάσει σε όλους μέχρι να βγούν από αυτό! Η ρουτίνα Barrier χρησιμοποιεί εντολές προσπέλασης μνήμης σε κοινές μεταβλητές 13
Συνέπεια μνήμης - consistency! Δεν αρκεί ότι η μνήμη επιστρέφει την τελευταία τιμή για μία θέση, χρειαζόμαστε κάποιες φορές την ιδιότητα οι εγγραφές και αναγνώσεις σε διαφορετικές θέσεις να γίνονται με τη κατάλληλη σειρά.! Το μοντέλο συνέπειας μνήμης θέτει περιορισμούς ως προς τη σειρά με την οποία φαίνονται (στους πυρήνες) να γίνονται οι προσπελάσεις μνήμης Είναι υπερσύνολο της συνοχής μνήμης 14
Ακολουθιακή συνέπεια Κάθε πυρήνας εκτελεί προσπελάσεις σύμφωνα με τη σειρά προγράμματος Κάθε προσπέλαση γίνεται αδιαίρετα (atomically): ολοκληρώνεται πρίν ξεκινήσει η επόμενη 15
Παράδειγμα αρχικά a=b=0 Processor 1 1a: a = 1; 1b: b = 2; Processor 2 2a: print b; 2b: print a; Ποιά είναι τα όλα τα επιτρεπόμενα αποτελέσματα (b,a)υποθέτοντας SC;! (0,0), (2,1), (0,1) 16
Ποιές είναι όλες οι δυνατές ακολουθίες εντολών;! 1a, 1b, 2a, 2b: (1,2) 2a, 2b, 1a, 1b: (0,0)! 1a, 1b, 2b, 2a: (1,2) 2a, 2b, 1b, 1a: (0,0)! 1a, 2a, 1b, 2b: (1,0) 2a, 1a, 2b, 1b: (1,0)! 1a, 2a, 2b, 1b: (1,0) 2a, 1a, 1b, 2b: (1,0)! 1a, 2b, 1b, 2a: (1,2) 2a, 1b, 2b, 1a: (0,0)! 1a, 2b, 2a, 1b: (1,0) 2a, 1b, 1a, 2b: (1,0)! 1b, 1a, 2a, 2b: (1,2) 2b, 2a, 1a, 1b: (0,0)! 1b, 1a, 2b, 2a: (1,2) 2b, 2a, 1b, 1a: (0,0)! 1b, 2a, 1a, 2b: (1,2) 2b, 1a, 2a, 1b: (0,0)! 1b, 2a, 2b, 1a: (0,2) 2b, 1a, 1b, 2a: (0,2)! 1b, 2b, 1a, 2a: (0,2) 2b, 1b, 2a, 1a: (0,2)! 1b, 2b, 2a, 1a: (0,2) 2b, 1b, 1a, 2a: (0,2) 17
Ικανές συνθήκες Ικανές (όχι αναγκαίες) συνθήκες για SC: 1. κάθε νήμα ξεκινάει προσπελάσεις μνήμης με τη σειρά του προγράμματος 2. όταν ένα νήμα ξεκινάει μια εγγραφή, το νήμα πρέπει να περιμένει να ολοκληρωθεί η εγγραφή πριν ξεκινήσει την επόμενη προσπέλαση 3. όταν ένα νήμα ξεκινήσει μια ανάγνωση, το νήμα πρέπει να περιμένει να ολοκληρωθεί η ανάγνωση και η εγγραφή την τιμή της οποίας η ανάγνωση φέρνει, πριν ξεκινήσει την επόμενη προσπέλαση 18
Παράδειγμα 2 P1 a = 1; P2 while (a==0); b = 1; P3 while (b==0); print a;! Αφού ο P2 περιμένει την τιμή του a πριν γράψει το b και ο P3 περιμένει την τιμή του b, είναι λογικό να περιμένουμε ότι ο P3 θα δεί την καινούρια τιμή του a! Τι μπορεί να πάει στραβά;! Αν ο P2 αλλάξει το b, πριν η αλλαγή του a γίνει γνωστή στον P3,! Πώς μπορεί να γίνει κάτι τέτοιο; 19
Συνέπειες για το υλικό Ενα παράλληλο σύστημα που εγγυάται την ακολουθιακή συνέπεια δεν μπορεί να χρησιμοποιεί μια σειρά από αρχιτεκτονικές τεχνικές αύξησης απόδοσης:! Εκτέλεση εκτός σειράς! write buffers! non- blocking caches! και βελτιστοποιήσεις του μεταφραστή Οι πυρήνες των παράλληλων μηχανών θα είναι πολύ αργοί! Μεγάλο μέρος του κέρδους από τον παραλληλισμό, χάνεται 20
Παράδειγμα Κόστος write miss:! establish ownership: 50 cycles! Invalidate comple on and acknowledgement: 80 cycles! Issue an invalidate: 10 cycles! 4 cores need to be invalidated Πόσοι κύκλοι χρειάζονται για SC?! Μπορούμε να επικαλύψουμε τα invalida ons! Κόστος: 50 + 4*10+80 = 170 κύκλοι 21
Χαλαρή συνέπεια μνήμης! Γι αυτό τα περισσότερα παράλληλα συστήματα δεν υποστηρίζουν ακολουθιακή συνέπεια αλλά πιο χαλαρά μοντέλα συνέπειας μνήμης (relaxed mem consistency) επιτρέπουν αλλαγές σειράς ή επικαλυπτόμενη εκτέλεση εντολών! Για να μπορεί ο προγραμματιστής να εξασφαλίσει τη σειρά εκτέλεσης υπάρχουν εντολές «φράκτες μνήμης» (fence): οι εντολές πριν το φράκτη πρέπει να ολοκληρωθούν πριν ξεκινήσουν οι εντολές μετά 22
Relaxed Consistency Models! Rules X Y Opera on X must complete before opera on Y is done Sequen al consistency requires:! R W, R R, W R, W W! Relax W R Total store ordering! Relax W W Par al store order! Relax R W and R R Weak ordering and release consistency 23
Συνέπειες για προγραμματισμό! Πολύ λίγοι προγραμματιστές στηρίζονται σε SC οι περισσότεροι χρησιμοποιούν υψηλού επιπέδου συγχρονισμό! Ενα καλά συγχρονισμένο πρόγραμμα προστατεύει τις μοιραζόμενες μεταβλητές του ώστε να μην υπάρχει ανταγωνισμός (race) όταν ανανεώνονται οι τιμές τους υπάρχει όμως ανταγωνισμός για τις μεταβλητές συγχρονισμού! Με αυτές τις συνθήκες, η αλλαγή της σειράς εκτέλεσης εντολών δεν επηρεάζει το παράλληλο πρόγραμμα, αρκεί να εξασφαλίσουμε ότι κατά την είσοδο ή έξοδο από ένα κλείδωμα, οι τιμές έχουν ανανεωθεί παντού στη μνήμη 24
Παράδειγμα... lock(); read and modify shared data unlock();... όλες οι επόμενες αναγνώσεις διαβάζουν τις τελευταίες τιμές όλες οι εγγραφές έχουν ολοκληρωθεί 25
! Ενα σειριακό σύστημα δεν χρειάζεται να γνωρίζει πότε ολοκληρώθηκε μια εγγραφή! Ενα παράλληλο σύστημα, ακόμα και με ένα χαλαρό μοντέλο συνοχής, πρέπει να παίρνει αυτή τη πληροφορία επιβεβαίωση (acknowledgement) εγγραφής! όταν εκτελείται μια εγγραφή δεν γνωρίζουμε αν ακολουθεί μια fence οπότε η επιβεβαίωση είναι απαραίτητη πάντα 26
Cache inclusion! Οι πολυεπεξεργαστές έχουν πολλαπλά επίπεδα κρυφής μνήμης! Ιδιότητα cache inclusion: κάθε γραμμή μιας cache περιέχεται και στη cache του επόμενου επιπέδου π.χ. η L1 είναι υποσύνολο της L2! Εύκολα ελέγχει η L2 αν μια γραμμή υπάρχει στη L1 ώστε να ακυρωθεί! Αλλά πολύς «χαμένος» χώρος... 27
Διατήρηση inclusion - παράδειγμα! Υποθέτουμε 2 επίπεδα κρυφής μνήμης! με ίδιο μέγεθος γραμμής! write- back (write- through ελαφρώς ευκολότερο)! 2- way associa ve! a, a, b γραμμές στη L1 και A, A, B αντίστοιχες γραμμές στη L2 28
Sun/Oracle T1 CMP! Εμφαση σε TLP αντί για ILP 8 cores, κάθε ένας με 4 (hardware) threads! Απλή διοχέτευση 6 σταδίων 2 ο στάδιο επιλέγει thread από 4 ενεργά load, branch penalty είναι 3 κύκλοι Μία μονάδα υπολογισμού floa ng point μοιραζόμενη από όλους τους πυρήνες! Η L2 cache είναι μοιραζόμενη και χωρισμένη σε 4 banks μαζί με το directory L1 είναι write- through! Υπάρχει πλέον Τ5! Οι Τ1, Τ2 υπάρχουν και open source: βλ. opensparc 29
Επιδόσεις! Ιδανικό CPI ανά thread = 4 σε κάθε κύκλο εκτελείται διαφορετικό thread! Ιδανικό CPI ανά πυρήνα = 1 30
Επιδόσεις! Not ready δε σημαίνει ότι ο πυρήνας είναι idle. Πρέπει και τα 4 threads να είναι not- ready 31
Επίδοση MT στη μνήμη! Αύξηση σε miss rate και latency όταν εκτελουνται 4 threads σε σχέση με όταν εκτελείται 1 thread! Η μικρή αύξηση στο latency δείχνει ότι το σύστημα μνήμης έχει αναξιοποίητη ικανότητα 32
Συγκρίσεις απόδοσης! Συχνά σε πολυπύρηνα συστήματα παρουσιάζεται η απόδοση με τη μορφή speedup σε σχέση με τον αριθμό των πυρήνων μπορεί το speedup να αυξάνεται γραμμικά αλλά ο χρόνος εκτέλεσης να είναι μεγαλύτερος ακόμα και σε σχέση με ένα μονοεπεξεργαστή! floa ng- point προγράμματα χωρίς ειδικό hardware έχουν καλό scaling, αλλά η συνολική επίδοση είναι μικρή! Οι αλγόριθμοι που συγκρίνονται έχουν σημασία ένας παράλληλος αλγόριθμος είναι συχνά πιο αργός σε ένα μονο- επεξεργαστή από ένα σειριακό αλγόριθμο 33
Μεταφορά λογισμικού! Απευθείας μεταφορά λογισμικού από μονο- επεξεργαστή σε πολυεπεξεργαστή! Παράδειγμα: Λειτουργικό σύστημα SGI (Unix της MIPS)! Η δομή δεδομένων του page table είχε μία κλειδαριά ώστε οι αλλαγές να γίνονται σωστά από διαφορερικά νήματα του Λ.Σ. Δεν είχε προβλήματα απόδοσης σε μονο- επεξεργαστή Σε πολυ- πύρηνα συστήματα ήταν bodleneck: όλα τα νήματα ξεκινούσαν ταυτόχρονα και αρχικοποιούν πολλές σελίδες μνήμης (σταθερές, global μεταβλητές, ) 34