ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2 6ο μάθημα: χρονοπρογραμματισμός, αλγόριθμος Tomasulo, εικασία Αρης Ευθυμίου Πηγές διαφανειών: συνοδευτικές διαφάνειες αγγλικης εκδοσης του βιβλιου
InstrucDon- Level Parallelism! Θέλουμε να εκμεταλευτούμε τον παραλληλισμό μεταξύ εντολών ενός προγράμματος όσο περισσότερο μπορούμε με επικάλυψη εκτέλεσης (διοχέτευση) και, καλύτερα, με παράλληλη εκτέλεση! Δύο εντολές είναι παράλληλες όταν μπορούν να εκτελεστούν ταυτόχρονα σε διοχέτευση οποιουδήποτε βάθους, χωρίς να προκαλέσουν stalls ούτε, φυσικά, λάθος αποτελέσματα!! Αν δεν είναι παράλληλες, μπορούν ακόμα να εκτελεστούν με επικάλυψη Σημαντικό να διαπιστωθεί αν μία εντολή εξαρτάται από μια άλλη! Εξαρτήσεις: δεδομένων, ονομάτων, ελέγχου 2
Εξαρτήσεις δεδομένων! Μια εντολή j εξαρτάται από μια άλλη i αν Η i παράγει ένα αποτέλεσμα που χρειάζεται η j Η j έχει εξάρτηση δεδομένων από την k και η k από την i! Μια εντολή παράγει ένα αποτέλεσμα που μία άλλη χρησιμοποιεί (καταναλώνει). ή υπαρχει μία ενδιάμεση εντολή... Μια εντολή του τύπου ADD R1, R1, R1 δεν θεωρείται ότι έχει εξάρτηση 3
(Αληθινές) εξαρτήσεις δεδομένων! Δύο εξαρτημένες εντολές δεν μπορούν ποτέ να εκτελεστούν ταυτόχρονα! Αληθινές εξαρτήσεις είναι ιδιότητες των προγραμμάτων! Προκαλούν κινδύνους διοχέτευσης και τελικά καθυστερήσεις λόγω stalls! Η εξάρτηση μπορεί να ξεπεραστεί 1. εξαφανίζοντάς την, αλλάζοντας τον κώδικα 2. αποφεύγοντας τους αντίστοιχους κινδύνους διοχέτευσης! Εξαρτήσεις δεδομένων μπορεί να υπάρχουν μέσω καταχωρητών αλλά και μέσω διευθύνσεων μνήμης 4
Εξαρτήσεις ονομάτων! Δύο εντολές χρησιμοποιούν τον ίδιο καταχωρητή ή θέση μνήμης (όνομα) αλλά δεν γίνεται μεταφορά δεδομένων μέσω του καταχωτητή/μνήμης! Αντι- εξάρτηση (anddependence) μια νέα εντολή γράφει στον καταχωρητή που μια παλιότερη διαβάζει η παλιότερη εντολή πρέπει να μή διαβάσει τα καινούρια δεδομένα!! Εξάρτηση εξόδου (output dependence) δύο εντολές γράφουν στον ίδιο καταχωρητή ο καταχωρητής πρέπει να κρατήσει τα δεδομένα που γράφει η τελευταία εντολή! Μπορούν πάντα να αποφευχθούν αλλάζοντας τα ονόματα! 5
Κίνδυνοι δεδομένων! Κίνδυνοι (hazards) εμφανίζονται όταν υπάρχει εξάρτηση μεταξύ 2 εντολών και βρίσκονται αρκετά κοντά μεταξύ τους ώστε η επικάλυψη εκτέλεσης να μπορεί να δημιουργήσει πρόβλημα δηλαδή λάθος αποτέλεσμα! Οπως είδαμε υπάρχουν 3 είδη RAW αληθινή εξάρτηση δεδομένων WAR αντιεξάρτηση WAW εξάρτηση εξόδου 6
Χρονοπρογραμματισμός! Για να διατηρηθεί η διοχέτευση πλήρης και να εκμεταλευτούμε το παραλληλισμό εντολών, ο compiler πρέπει να βρίσκει ακολουθίες ανεξάρτητων εντολών που η εκτέλεσή τους να επικαλύπτεται πλήρως 7
Παράδειγμα! Βρόγχος με ανεξάρτητες επαναλήψεις! Loop- level parallelism 8
Παράδειγμα, scheduled code! Μετέφερα μια ανεξάρτητη εντολή πίσω από τη L.D για να αποφύγω το load- use latency! Ταυτόχρονα απέφυγα τη καθυστέρηση μεταξύ αριθμητικής πράξης και διακλάδωσης! Δεν μπορώ να κάνω κάτι καλύτερο γιατί έχω λίγες εντολές διαθέσιμες 9
Παράδειγμα: loop unrolling! Ξετυλίξαμε το βρόγχο 4 φορές αφαιρέσαμε εντολές ελέγχου βρόγχου αυξήσαμε τον αριθμό διαθέσιμων εντολών για χρονοπρογραμματισμό 10
Κόστος ξετυλίγματος! Αύξηση μεγέθους κώδικα μπορεί να αυξήσει cache misses! Αύξηση αριθμού καταχωρητών register pressure αν χρειάζονται περισσότεροι από τους διαθέσιμους, θα χρειαστούν εντολές μεταφοράς δεδομένων προς/από τη μνήμη 11
Dynamic Scheduling! Στατικός χρονοπρογραμματισμός: σημαντικό κέρδος επίδοσης, αλλάζοντας σειρά εντολών και με τεχνικές όπως ξετύλιγμα/ξεδίπλωμα βρόγχου! Ο δυναμικός χρονοπρογραμματισμός, επιτρέπει σε μετέπειτα εντολές να εκκινηθούν, αν είναι ανεξάρτητες! Μια εντολή μπορεί να εκτελεστεί αν οι τελεσταίοι (εισόδου) είναι έτοιμοι υπάρχει κατάλληλη μονάδα για να εκτελέσει την πράξη ο καταχωρητής αποτελέσματος είναι έτοιμος (για εγγραφή)! Το πρόγραμμα μετατρέπεται σε ένα διάγραμμα ροής δεδομένων 12
Data Flow Graph (DFG) i1: r2 = 4(r22) i2: r10 = 4(r25) i3: r10 = r2 + r10 i4: 4(r26) = r10 i5: r14 = 8(r27) i6: r6 = (r22) i7: r5 = (r23) i8: r5 = r6 r5 i9: r4 = r14 * r5 i10: r15 = 12(r27) i11: r7 = 4(r22) i12: r8 = 4(r23) i13: r8 = r7 r8 i14: r8 = r15* r8 i15: r8 = r4 r8 i16: (r28) = r8 i1 i3 i4 i2 i5 i6 i9 i8 i7 i15 i10 i11 i14 i13 i12 i16 Data Flow Graph (or Data Dependency Graph) 13
Εκτέλεση εκτός σειράς i1: r2 = 4(r22) i2: r10 = 4(r25) i3: r10 = r2 + r10 i4: 4(r26) = r10 i5: r14 = 8(r27) i6: r6 = (r22) i7: r5 = (r23) i8: r5 = r6 r5 i9: r4 = r14 * r5 i10: r15 = 12(r27) i11: r7 = 4(r22) i12: r8 = 4(r23) i13: r8 = r7 r8 i14: r8 = r15* r8 i15: r8 = r4 r8 i16: (r28) = r8 i1 i3 i4 i2 i5 i6 i9 i8 i7 i15 i10 i11 i14 i13 i12 i16 14
Dynamic Scheduling! Το στάδιο ID χωρίζεται σε δύο Εκκίνηση (Issue) αποκωδικοποίηση, έλεγχος δομικών κινδύνων Ανάγνωση τελεστέων (read operands) περιμένε μέχρι να μην υπάρχουν κίνδυνοι δεδομένων, διάβασε τελεστέους! Αποτέλεσμα: εκτέλεση εκτός σειράς προκαλούνται προβλήματα λόγω μη- πραγματικών εξαρτήσεων! Εξετάζουμε ξανά τις μη- πραγματικές εξαρτήσεις... 15
Εξαρτήσεις ονομάτων! Εξάρτηση εξόδου (F6)! Αντιεξάρτηση (F8)! Αλλάζοντας μερικά «ονόματα» καταχωτητων: (παλιό) F6 γίνεται S (νέο) F8 γίνεται T 16
Μετονομασία καταχωρητών! Αγγλικός όρος: Register renaming! Σχετικά λίγοι «αρχιτεκτονικοί καταχωρητές» απαιτούν χώρο στη κωδικοποίηση εντολών: 32 καταχωρητές - 5 bit, x3 (2 πηγές, 1 προορισμός) Ο μεταγλωτιστής προσπαθεί να τους χρησιμοποιήσει όσο περισσότερο γίνεται για να αποφύγει προσπελάσεις μνήμης Επαναχρησιμοποίηση καταχωρητών (ονομάτων) για δεδομένα που δεν έχουν σχέση μεταξύ τους 17
Υλοποίηση μετονομασίας! Μεγάλο αρχείο φυσικών (physical) καταχωρητών κατά την αποκωδικοποίηση, ο καταχωρητής προορισμού μετονομάζεται σε έναν από τους διαθέσιμους φυσικούς καταχωρητές οι καταχωρητές πηγής επίσης αλλάζουν ώστε να αντιστοιχούν στους σωστούς φυσικούς καταχωρητές Χρειάζεται πίνακας απεικόνισης...! Χρησιμοποιούνται επιπλέον καταχωρητές διάσπαρτοι σε άλλες δομές περισσότερα σε λίγο... 18
Αλγόριθμος μετονομασίας! Rename: πίνακας αντιστοίχισης λογικών σε φυσικούς καταχωρητές! Freelist: λίστα διαθέσιμων φυσικών καταχωρητών Μετονομασία R i <- R j op R k σε R a <- R b op R c! R a = Freelist()! R b = Rename[R j ]! R c = Rename[R k ]! Rename[R i ] = R a Η μετονομασία γίνεται κατά την αποκωδικοποίηση συχνά ως χωριστό στάδιο διοχέτευσης 19
Tomasulo dynamic scheduling! Η μετονομασία γίνεται μέσω των reservadon stadons (σταθμοί κράτησης?) Χώροι αποθήκευσης συνδεδεμένοι με μια funcdonal unit! Κατά την εκκίνηση μιας εντολής, δεσμεύεται ένα reservadon stadon Διαβάζει και αποθηκεύει τελεστέους αν είναι έτοιμοι Κρατάει τα «ονόματα» (tags) των reservadon stadons των εντολών που θα παράξουν τα αποτελέσματα που χρειάζεται Τα αποτελέσματα συνοδεύονται από το όνομα του reservadon stadon Ολοι οι reservadon stadons προσέχουν τα αποτελέσματα για να βρούν τα ονόματα και τα δεδομένα που περιμένουν 20
Δομή Tomasulo From instruction unit Instruction queue FP registers Load/store operations Store buffers Address unit Load buffers Floating-point operations Operand buses Operation bus 3 2 1 Reservation stations 2 1 Data Memory unit Address FP adders FP multipliers Common data bus (CDB) 21
Εντολές προσπέλασης μνήμης! Οι εντολές προσπέλασης μνήμης χρειάζονται 2 βήματα εκτέλεσης Υπολογισμός διεύθυνσης (όταν η τιμή καταχωρητή είναι γνωστή) Προσπέλαση μνήμης! Η διεύθυνση (effecdve address) εγγράφεται σε μία θέση στο load, store buffer! Οι load εκτελούνται όταν το σύστημα μνήμης είναι διαθέσιμο! Οι εγγραφές πρέπει να περιμένουν να υπολογιστεί η τιμή του καταχωρητή εγγραφής ολοκληρώνονται στο στάδιο Write Result! Η εκτέλεση των εντολών προσπέλασης μνήμης γίνεται με τη σειρά προγράμματος 22
Παράδειγμα εκτ. Tomasulo These are RS, we have only one FU for each type (MUL, ADD, LD). LD 1 cycle, ADD/SUB 2c, MULT 10c, DIV 50c 23
Tomasulo Example Cycle 1 24
Tomasulo Example Cycle 2 25
Tomasulo Example Cycle 3 26
Tomasulo Example Cycle 4 27
Tomasulo Example Cycle 5 28
Tomasulo Example Cycle 6 29
Tomasulo Example Cycle 7 30
Tomasulo Example Cycle 8 31
Tomasulo Example Cycle 9 32
Tomasulo Example Cycle 10 33
Tomasulo Example Cycle 11 34
Tomasulo Example Cycle 12 35
Tomasulo Example Cycle 13 36
Tomasulo Example Cycle 14 37
Tomasulo Example Cycle 15 38
Tomasulo Example Cycle 16 39
Tomasulo Example Cycle 55 40
Tomasulo Example Cycle 56 41
Tomasulo Example Cycle 57 42
Αλγόριθμος Tomasulo 43
Σύγκριση με scoreboarding! Κατανεμημένη λογική ανίχνευσης κινδύνων (hazards)! Εξάλειψη κινδύνων WAR, WAW 44
Διακλαδώσεις! Καμία εντολή δεν ξεκινάει την εκτέλεσή της πριν να έχουν ολοκληρωθεί οι προηγούμενες διακλαδώσεις! Αυτό είναι σημαντικό πρόβλημα κάθε ~6 εντολές εκτελείται μια διακλάδωση! Παρακάτω θα δούμε εκτέλεση με εικασία (speculadon) που λύνει το πρόβλημα 45
SpeculaDon! Το κύριο πρόβλημα που παραμένει είναι οι διακλαδώσεις! Η πρόβλεψη διακλάδωσης βοήθησε ώστε να προσκομίζουμε εντολές μετά από τη διακλάδωση πρίν εκτελέσουμε την διακλάδωση! Αλλά για να εκτελέσουμε εντολές μετά τη διακλάδωση πρέπει να περιμένουμε το αποτέλεσμά της! Με εκτέλεση εικασίας θα εκτελούμε εντολές μετά από τη διακλάδωση σαν να είχαμε προβλέψει σωστά πρέπει να μπορούμε να αναιρούμε εντολές που δεν έπρεπε να εκτελεστούν 46
Βασικές ιδέες! Ξεχωρίζουμε τις πράξεις: προώθησης αποτελέσματος σε άλλες εντολές που το περιμένουν ολοκλήρωσης της εντολής! Μπορούμε να επιτρέψουμε την προώθηση αποτελεσμάτων εντολών που εκτελούνται με «εικασία»!... αλλά όχι την αλλαγή καταχωρητών/μνήμης που δεν μπορούν να αναιρεθούν! Συγκεκριμένα επιτρέπουμε αλλαγές στους αρχιτεκτονικούς καταχωρητές και στη μνήμη, μόνο από εντολές που (σίγουρα) ολοκληρώνονται! Νέο στάδιο commit (υποβολή, δέσμευση)! Οι εντολές εκτελούνται εκτός σειράς, αλλά κάνουν commit στη σειρά προγράμματος 47
Reorder buffer! Χρειάζεται ένα είδος ουράς που κρατά τα αποτελέσματα από τη στιγμή που υπολογίζονται μέχρι η εντολή να κάνει commit! Χρησιμοποιείται και για μετονομασία καταχωρητών παρόμοια με τον αλγόριθμο Tomasulo! Ονομάζεται reorder buffer (ROB)! Κύρια πεδία είδος εντολής (αρχιτεκτονικός) καταχωρητής προορισμού τιμή αποτελέσματος έτοιμο αποτέλεσμα 48
Αναίρεση εντολών! Οταν μια διακλάδωση κάνει commit Αν η πρόβλεψη ήταν σωστή, τέλος! Αλλιώς ακύρωση όλων των εντολών που βρίσκονται μέσα στο ROB και προσκόμιση από τη σωστή διεύθυνση! Αν μια εντολή προκάλεσε διακοπή ακύρωσε όλες τις επόμενες εντολές εκτέλεσε τη ρουτίνα εξυπηρέτησης διακοπών! Αφού δεν έχει αλλάξει η κατάσταση των αρχιτεκτονικών καταχωρητών και της μνήμης, η ακύρωση είναι εύκολη 49
Tomasulo με reorder buffer From instruction unit Reorder buffer Instruction queue Reg # FP registers Data Address unit Load/store operations Load buffers Floating-point operations Operand buses Operation bus Store data Store address Memory unit 3 2 1 Address FP adders Reservation stations FP multipliers 2 1 Load data Common data bus (CDB) 50
Βήματα εκτέλεσης 1 Εκκίνηση:! Διάβασε εντολή από την ουρά εντολών! Αν υπάρχει ελεύθερη θέση στο ROB και θέση σε reservadon register, «στείλε» την εντολή στο reservadon register Εκτέλεση:! Παρακολούθησε το CDB για αποτελέσματα που περιμένεις! Οταν όλοι οι τελεστέοι είναι έτοιμοι ξεκίνα την εκτέλεση 51
Βήματα εκτέλεσης 2 Write result:! Γράψε το αποτέλεσμα στο CDB μαζί με το tag της θέσης του ROB και από το CDB στη θέση της εντολής στο ROB Commit:! Περίμενε μέχρι η εντολή να βρίσκεται στη κεφαλή της ουράς του ROB! Αν έγινε διακοπή ή λάθος πρόβλεψης διακλάδωσης, ακύρωσε τις υπόλοιπες εντολές! Γράψε το αποτέλεσμα στον αρχιτεκτονικό καταχωρητή ή στη μνήμη 52
Εξαρτήσεις μέσω μνήμης! Κίνδυνοι WAR, WAW εξαλείφονται:! Οι εγγραφές γίνονται με τη σειρά του προγράμματος προηγούμενες αναγνώσεις (και εγγραφές) έχουν ήδη γίνει! Οι κίνδυνοι RAW απαιτούν επιπλέον περιορισμούς: καμία LOAD δεν μπορεί να διαβάσει τη μνήμη αν υπάρχει στο ROB STORE με την ίδια διεύθυνση οι διευθύνσεις υπολογίζονται με τη σειρά προγράμματος 53
Υλοποίηση 1 54
Υλοποίηση 2 55
Υλοποίηση 3 56
Πολλαπλή εκκίνηση! Μέχρι τώρα προσκομίζαμε 1 εντολή και εκκινούσαμε 1 εντολή σε κάθε κύκλο! Μια λογική επέκταση είναι να προσκομίζουμε και να εκκινούμε περισσότερες εντολές ανά κύκλο οι επεξεργαστές αυτοί λέγονται υπερβαθμωτοί superscalar! Θα εξετάσουμε πρώτα υπερβαθμωτούς επεξεργαστές με στατικό χρονοπρογραμματισμό και τύπου VLIW (very- large instrucdon word) 57
Στατικοί υπερβαθμωτοί επεξεργαστές! Σχετικά απλή υλοποίηση: αύξηση του πλάτους (width) των καλωδίων επεξεργαστή- μνήμης ώστε να διαβάζονται πολλαπλές εντολές πολλαπλασιασμός του αποκωδικοποιητή εντολών, θυρών αρχείου καταχωρητών,...! Το κύριο πρόβλημα εδώ είναι εξαρτήσεις μεταξύ των εντολών που εκκινούν μαζί το υλικό ανιχνεύει εξαρτήσεις και καθυστερεί κάποιες εντολές ή υποθέτει ότι ο μεταγλωτιστής δεν τοποθετεί εξαρτημένες εντολές μαζί (στο ίδιο issue slot) 58
Επεξεργαστές VLIW! Γενικής χρήσης: IA- 64 ή Itanium! Αρκετά συνηθισμένο σε επεξεργαστές ψηφιακού σήματος (DSP)! Ο μεταγλωτιστής αναλαμβάνει το δύσκολο έργο εύρεσης αρκετής παραλληλίας από το πρόγραμμα και χρονοπρογραμματισμού των εντολών! Το υλικό είναι απλό και μπορεί να είναι έχει γρήγορο ρυθμό ρολογιού 59
Δυναμικοί superscalar! Οι περισσότεροι επεξεργαστές/πυρήνες γενικής χρήσης σήμερα ανήκουν σε αυτή τη κατηγορία! Συνδιάζουν: πολλαπλή εκκίνηση δυναμικό χρονοπρογραμματισμό εικασία! Το εμπρόσθιο τμήμα του επεξεργαστή (front- end) πρέπει να φέρνει πολλές εντολές σε κάθε κύκλο βήματα προσκόμισης, αποκωδικοποίησης, μετονομασίας, εκκίνησης! Το πίσω τμήμα (back- end) πρέπει να μπορεί να γράφει πολλαπλά αποτελέσματα και να κάνει commit πολλές εντολές ταυτόχρονα 60