Υ- 01 Αρχιτεκτονική Υπολογιστών Back- end: χρονοπρογραμματισμός, εντολές προσπέλασης μνήμης Αρης Ευθυμίου
Το σημερινό μάθημα Execu9on scheduling wake- up and select specula9ve wake- up Εκτέλεση εντολών προπέλασης μνήμης load- store buffers load specula9on 2
Reserva9on Sta9ons Μετά τη μετονομασία καταχωρητων οι εντολές στέλνονται (dispatch) σε reserva9on sta9ons μέχρι να είναι έτοιμες για εκτέλεση Συγκεντρωμένα όλα μαζί: instruc9on window καλύτερος διαμοιρασμός χώρου πολλές θύρες ανάγνωσης- εγγραφής Κατανεμημένα: reserva9on sta9ons Υβριδικές λύσεις: clusters ομάδα reserva9on sta9ons αντιστοιχούν σε ομάδα func9onal units 3
Wakeup & Select Το στάδιο issue (εκκίνησης εκτέλεσης), αποτελείται από 2 βήματα: Η ανίχνευση της «ετοιμότητας» μιας εντολής ονομάζεται αφύπνηση (wakeup) Πρέπει να γίνει επιλογή των εντολών που θα εκτελεστούν (select) Γενικά πολλές εντολές είναι έτοιμες κάθε στιγμή 4
Αφύπνιση Κάθε reserva9on sta9on παρακολουθεί τα αποτελέσματα που παράγονται για να δεί πότε οι τελεσταίοι εισόδου του είναι έτοιμοι αποτελέσμα: τιμή και αριθμός καταχωρητή προορισμού (tag) Με f func9onal units, μέχρι f αποτελέσματα θα είναι έτοιμα ανά κύκλο Αν ο αριθμός των reserva9on sta9ons είναι w και κάθε εντολή έχει μέχρι 2 τελεσταίους εισόδου χρειάζονται 2fw συγκριτές μεγάλο κόστος για busses και συγκριτές συχνά func9onal units μοιράζονται busses 5
Select Περισ. από 1 εντολές μπορεί να είναι έτοιμες και να χρειάζονται την ίδια func9onal unit πρέπει να υπάρχει μηχανισμός επιλογής 6
Επιλογή: προβλήματα Πολλαπλές func. units πολλαπλές εντολές πώς εξασφαλίζουμε ότι όλες οι f.u. δε θα διαλέξουν την ίδια εντολή; Επιλογή διευκολύνεται αν οι παλιότερες εντολές έχουν (κάπως) μεγαλύτερη προτεραιότητα δεν πρέπει να έχουμε starva9on Ποιές είναι οι παλιότερες; από τη θέση τους για να δουλέψει αυτό χρειάζεται compac9on (συμπαγοποίηση?) δεν είναι καθόλου εύκολο σε hardware 7
Υλοποίηση Οταν επιλεγεί, η εντολή εκπέμπει το tag της Τα ορίσματα διαβάζονται από τη RF ή προωθούνται x8 x8 8
Υλοποίηση αφύπνισης Ο χρόνος από την εκπομπή του tag μέχρι την ολοκλήρωση της εκτέλεσης του «παραγωγού» της τιμής δεν είναι σταθερός το πεδίο delay κρατά το χρόνο εκτέλεσης 9
Εκτέλεση back- to- back Εστω εντολές Α, Β: A εκτελείται σε ένα κύκλο Β εξαρτάται από την Α Θέλουμε η Β να εκτελεστεί στον αμέσως επόμενο κύκλο από αυτόν που εκτελείται η Α όπως στην απλή διοχέτευση 5 σταδίων με προώθηση δεδομένων 10
Διαχωρισμός select- wakeup Πιο ρεαλιστική υλοποίηση π.χ. Pen9um 6: 1 wake up, 3 scheduling stages Μεγάλη αύξηση του CPI καθυστέρηση μεταξύ εξαρτημένων εντολών ποινή διακλάδωσης 11
Ξύπνημα με εικασία Specula9ve wakeup H (εξαρτημένη) εντολή ξυπνάει νωρίτερα π.χ. όταν οι «παπούδες» της επιλεγούν για εκτέλεση επιλέγεται νωρίτερα, εκτελείται νωρίτερα Αν η εικασία ήταν λάθος ακύρωση της εντολής σβήσιμο του ready bit Συμπέρασμα: η θέση της εντολής στο reserva9on sta9on παραμένει μέχρι η εκτέλεσή της να έχει σίγουρα τελειώσει 12
Εντολές load/store Χρήση: οι καταχωρητές δεν επαρκούν για να αποθηκεύσουν όλα τα δεδομένα χρειάζεται μεταφορά τιμών καταχωρητή από/προς κύρια μνήμη Βήματα εντολών προσπέλασης μνήμης 1. υπολογισμός διεύθυνσης συνήθως reg+displacement 2. μετάφραση διεύθυνσης παράλληλα με προσπέλαση κρυφής μνήμης 3. εγγραφή/ανάγνωση μνήμης 13
Εντολές store Η πραγματική* εγγραφή γίνεται στο στάδιο commit μέχρι τότε δεν είναι σίγουρο ότι η store θα πρέπει να εκτελεστεί δεν είναι εύκολο να αναιρεθούν εγγραφές στη μνήμη * όσο αφορά τον επεξεργαστή. Η μνήμη μπορεί να αργήσει ακόμη περισσότερο μέχρι να κάνει την εγγραφή Αυτό είναι πολύ αργά OoO, superpipelined, superscalar: εκατοντάδες εντολές μετά τη store βρίσκονται σε διάφορα στάδια εκτέλεσης Γιατί μας νοιάζει; μια load ίσως να εξαρτάται από τη store πόσο θα πρέπει να περιμένει για να εκτελεστεί σίγουρα σωστά; 14
Εξαρτήσεις μέσω μνήμης Μία load(a) επιστρέφει τη τιμή που έγραψε μια προηγούμενη store(a,v) Εξαρτήσεις μέσω μνήμης: RAW store (a,v), load(a) WAR load(a) store(a,v ) WAW store(a,v) store(a,v ) 15
Ανίχνευση εξάρτησης Δυσκολότερη ανίχνευση εξάρτησης γιατί η διεύθυνση πρέπει να υπολογιστεί (κατά την εκτέλεση της εντολής) και η τιμή του καταχωρητή διεύθυνσης μπορεί να υπολογίζεται από προηγούμενη εντολή Η ίδια εντολή load/store συχνά υπολογίζει διαφορετική διεύθυνση π.χ. βρόγχος που χειρίζεται πίνακες δεδομένων Οι διευθύνσεις είναι μεγάλες (π.χ. 64bit) μεγαλύτερη καθυστέρηση για σύγκριση Ορολογία: memory aliasing: δύο αναφορές (references) αντιστοιχούν στην ίδια διεύθυνση memory disambigua9on: εξέταση αν υπάρχει aliasing 16
Απλοϊκή λύση Μια load περιμένει όλες τις προηγούμενες store να κάνουν commit, πριν προσπελάσει τη μνήμη Αν δεν υπάρχουν όμως store, η σειρά εκτέλεσης μεταξύ load μπορεί να αλλάξει Υλοποίηση: ουρά FIFO (εισαγωγή στο dispatch) store: όταν η τιμη του καταχωρητή διεύθυνσης είναι έτοιμη, υπολόγισε διεύθυνση εγγραφή στο στάδιο commit load: εκτέλεση όταν η ο καταχωρητής διεύθυνσης είναι έτοιμος και δεν υπάρχουν παλιότερες store 17
Επίδοση απλοϊκής λύσης 18
Load scheduling Μερικές φορές μπορούμε να επιτρέψουμε load να εκτελεστούν νωρίτερα, χωρίς να κινδυνέψουμε load bypassing, load forwarding 19
Αλγόριθμος load scheduling Κάθε load και store τοποθετούνται με τη σειρά προγράμματος σε μια ουρά μερικές φορές σε ξεχωριστές ουρές Οταν μία load έχει υπολογίσει τη διεύθυνσή της εξετάζει τις προηγούμενες store με τη σειρά (νεώτερες προς παλιότερες) αν υπάρχει store με την ίδια διεύθυνση και με δεδομένα, forwarding αν υπάρχει store με άγνωστη διεύθυνση, η load δεν μπορεί να συνεχίσει αν υπάρχει store με την ίδια διεύθυνση αλλά χωρίς δεδομένα, δεν μπορεί να συνεχίσει αν η αναζήτηση φτάσει στο τέλος της ουράς, bypassing 20
Load specula9on Υποθέτουμε ότι δεν υπάρχουν RAW κίνδυνοι μεταξύ μιας load και προηγούμενων store το θέμα είναι με stores που δεν έχουν υπολογίσει ακόμη τις διευθύνσεις τους memory dependence predic9on Εκτελούμε τη load και όλες τις επόμενες εξαρτημένες απο αυτή εντολές αν η εικασία αποδειχθεί λάθος, ακύρωση της load και των επόμενων εξαρτημένων εντολών μεγάλο κόστος 21
Load specula9on Τρείς παραλλαγές: Pessimis9c παρόμοιο με load forwarding και bypassing Naïve/Op9mis9c υποθέτουμε πάντα ότι δεν υπάρχει εξάρτηση Selec9ve, dependence predic9on επιλογή load από τις οποίες έχουμε μεγάλο όφελος επίδοσης Ελεγχος λάθος πρόβλεψης: Οταν μια store κάνει commit ή, καλύτερα, όταν υπολογίζεται η διεύθυνσή της, ελέγχει αν υπάρχουν μετέπειτα load με την ίδια διεύθυνση που έχουν ήδη εκτελεστεί 22
Naïve specula9on Εξαρτήσεις load- store δεν είναι συχνές Αλλά λόγω μεγάλου κόστους λάθος πρόβλεψης, η μέθοδος δεν είναι αποδοτική σε μεγάλα instruc9on windows 23
Dependence pred. take 1 Υποθέτουμε αρχικά ότι κάθε load είναι ανεξάρτητη Αν η υπόθεση αποδειχθεί λανθασμένη, η load σημειώνεται ως εξαρτημένη και κάθε φορά που εκτελείται, δεν προσπερνά προηγούμενες store που δεν έχουν υπολογίσει τη διεύθυνσή τους Πώς γίνεται η σημείωση; 1 bit στη κρυφή μνήμη εντολών Χρησιμοποιήθηκε στον DEC Alpha 21264 24
Ιδανικός predictor Kρατά όλα τα ζεύγη load- store που «συγκρούονται» όταν ανακαλύπτεται σύγκρουση το ζεύγος αποθηκεύεται σε μία συσχετιστική μνήμη (δλδ. με δυνατότητα αναζήτησης) Κάθε load αναζητά στο πίνακα τη διεύθυνσή της και βρίσκει τις αντίστοιχες store Αν υπάρχει μία από τις store στο store buffer, περιμένει αλλιώς ξεκινά εκτέλεση με εικασία 25
Store set Store set: το σύνολο των store που συγκρούονται με μια load επειδή οι store εκτελούνται με τη σειρά, αντί για σύνολο χρησιμοποιείται η τελευταία store Πίνακας SSIT κρατάει δείκτες στον πίνακα LFST (περιέχει τη διεύθυνση της τελευταίας store του συνόλου) ο SSIT καταχωρεί και load και store εντολές 26
Αναζήτηση Store: στάδιο decode: Αν υπάρχει καταχώρηση στο SSIT, γράφει τη διεύθυνσή της στην θέση του LFST στάδιο commit: ακύρωση της θέσης στο LFST αν ακόμη περιλαμβάνει τη δική της διεύθυνση Load: στάδιο decode: Αν υπάρχει καταχώρηση στο SSIT και η αντίστοιχη καταχώρηση στο LFST είναι έγκυρη, η load περιμένει αλλιώς η load εκτελείται με εικασία 27
Ενημέρωση 1/3 2 load εξαρτώνται από το ίδιο store 28
Ενημέρωση 2/3 Μία load εξαρτάται από 2 stores π.χ. υπάρχει if- then- else που επιλέγει τη store 29
Ενημέρωση 3/3 30