ΠΛΕ- 027 Μικροεπεξεργαστές 8ο μάθημα: Παραλληλία επιπέδου εντολής Αρης Ευθυμίου
Ταχύτερη εκτέλεση Με τις τεχνικές που είδαμε στα προηγούμενα μαθήματα μπορούμε να εκτελέσουμε (με επικάλυψη) περίπου 1 εντολή ανά κύκλο ρολογιού κατά μέσο όρο διοχέτευση πρόβλεψη διακλάδωσης Πώς μπορούμε να αυξήσουμε την ταχύτητα εκτέλεσης περισσότερο; περισσότερη διοχέτευση γίνεται λιγότερο αποδοτική ταυτόχρονη εκτέλεση ανεξάρτητων εντολών τεχνικές αύξησης ταυτοχρονισμού (concurrency) ώστε να εκμεταλευτούμε το παραπάνω ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 2
Ταυτόχρονη εκτέλεση Χρειάζονται πολλαπλές μονάδες εκτέλεσης π.χ. ALUs, πολλαπλασιαστές,... Πολλά αντίγραφα του διοχευμένου data- path που εξετάσαμε σε προηγούμενα μαθήματα περισσότερες θύρες στο register file Προσκόμιση πολλών (συνεχόμενων) εντολών ταυτόχρονα Πολλαπλή εκκίνηση (muliple issue) ανεξάρτητων εντολών σε έναν κύκλο ρολογιού σε ξεχωριστές μονάδες/pipelines To CPI θα είναι < 1, χρησιμοποιούμε το αντίστροφο IPC ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 3
Εκτέλεση πολλαπλών εντολών ALU Mem IF ID Issue WB Fadd registers Fmul Διάφοροι δομικοί κίνδυνοι περισσότερες θύρες στο register file για ανάγνωση εγγραφή μονάδες εκτέλεσης που δεν είναι διοχετευμένες Εγγραφές αποτελεσμάτων εκτός σειράς από μονάδες με διαφορετικό χρόνο εκτέλεσης Fdiv ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 4
Πολλαπλή εκκίνηση Στατική πολλαπλή εκκίνηση (staic muliple issue) ο μεταγλωτιστής συγκεντρώνει εντολές που μπορούν να ξεκινήσουν ταυτόχρονα και τις τοποθετεί σε υποδοχές εκκίνησης (issue slots) ο μεταγλωτιστής είναι υπεύθυνος να ανιχνεύσει και να αποφύγει τους κινδύνους (hazards) Δυναμική πολλαπλή εκκίνηση (dynamic) ο πυρήνας εξετάζει το πρόγραμμα και αποφασίζει ποιές εντολές θα ξεκινήσουν ταυτόχρονα ο μεταγλωτιστής μπορεί να βοηθήσει τοποθετώντας τις εντολές σε κατάλληλη σειρά ο πυρήνας αντιμετωπίζει τους κινδύνους κατά την εκτέλεση ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 5
Στατική πολλαπλή εκκίνηση Ο μεταγλωτιστής συγκεντρώνει εντολές σε ένα πακέτο εκκίνησης (issue packet) οι εντολές ξεκινούν ταυτόχρονα, στον ίδιο κύκλο ρολογιού το είδος των εντολών εξαρτάται από τον αριθμό των μονάδων (γενκά πόρων) που υπάρχουν στο datapath Μοιάζει με μια μεγάλη εντολή ονομάζεται very- large instrucion word (VLIW) ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 6
Χρονοπρογραμματισμός Ο μεταγλωτιστής είναι υπεύθυνος για αποφυγή κινδύνων όλων ή τουλάχιστον των περισσότερων αναδιάταξη εντολών σε πακέτα εκκίνησης δεν πρέπει να υπάρχουν εξαρτήσεις μεταξύ εντολών στο πακέτο μπορεί να επιτρέπονται εξαρτήσεις μεταξύ πακέτων Συμπλήρωση με noops αν υπάρχουν κενές θέσεις σε πακέτα ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 7
Παράδειγμα: MIPS διπλής εκκίνησης Πακέτο: μία ALU ή διακλάδωση μαζί με μία load ή store ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 8
Ξετύλιγμα βρόχου Οι θέσεις στα πακέτα εντολών πρέπει να είναι γεμάτες για καλή απόδοση Ενας τρόπος που επιτρέπει στον μεταγλωτιστή να βρεί διαθέσιμες εντολές είναι το ξετύλιγμα βρόχου (loop unrolling) αντιγραφή κώδικα σώματος βρόχου από διαφορετικές επαναλλήψεις ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 9
Παράδειγμα ξετυλίγματος Loop: lw $t0, 0($s1) # $t0=array element addu $t0, $t0, $s2 # add scalar in $s2 sw $t0, 0($s1) # store result addi $s1, $s1, 4 # decrement pointer bne $s1, $zero, Loop # branch $s1!=0 ALU/branch Load/store cycle Loop: nop lw $t0, 0($s1) 1 addi $s1, $s1, 4 nop 2 addu $t0, $t0, $s2 nop 3 bne $s1, $zero, Loop sw $t0, 4($s1) 4 IPC = 5/4 = 1.25 (c.f. peak IPC = 2) ALU/branch Load/store cycle Loop: addi $s1, $s1, 16 lw $t0, 0($s1) 1 nop lw $t1, 12($s1) 2 addu $t0, $t0, $s2 lw $t2, 8($s1) 3 addu $t1, $t1, $s2 lw $t3, 4($s1) 4 addu $t2, $t2, $s2 sw $t0, 16($s1) 5 addu $t3, $t4, $s2 sw $t1, 12($s1) 6 nop sw $t2, 8($s1) 7 bne $s1, $zero, Loop sw $t3, 4($s1) 8 IPC = 14/8 = 1.75 ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 10
Υλοποίηση πολλαπλής εκκίνησης PC Inst. Mem 2 D Dual Decode GPRs X1 + X2 Data Mem X3 W 2 εντολές ανά πακέτο integer/mem FPRs κινητής υποδιαστολής Επιπλέον καταχωρητές διοχέτευσης σε μονάδες ώστε όλα τα είδη εντολών να γράφουν αποτελέσματα στον ίδιο κύκλο Καθυστέρηση (stall) για εντολές που παίρνουν πολύ χρόνο διαιρέσεις, αστοχίες κρυφής μνήμης,... Προώθηση δεδομένων X1 X2 FAdd X2 FMul Unpipelined divider FDiv X2 X3 X3 X3 W ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 11
Δυναμική πολλαπλή εκκίνηση Λέγονται και υπερβαθμωτοί επεξεργαστές (superscalar) Ο επεξεργαστής αποφασίζει αν θα ξεκινήσει 0, 1, 2,... εντολές ταυτόχρονα σε κάθε κύκλο όσες περισσότερες μπορεί Ο επεξεργαστής είναι υπεύθυνος για τη σωστή εκτέλεση αντιμετώπιση κινδύνων Δεν είναι απαραίτητη η βοήθεια του μεταγλωτιστή αν και μπορεί να διευκολύνει Μπορεί να εκτελέσει προγράμματα γραμμένα για απλούστερους επεξεργαστές της ίδιας αρχιτεκτονικής απευθείας ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 12
Ορια ILP Τώρα που έχουμε τη δυνατότητα παράλληλης και επικαλυπτώμενης εκτέλεσης εντολών, πόσο «μακριά» μπορούμε να πάμε; Οχι πολύ! Οι εντολές έχουν εξαρτήσεις: το αποτέλεσμα μιας εντολής χρειάζεται σε μια άλλη που δεν απέχει πολύ στο πρόγραμμα (ή ο παραγωγός αργεί π.χ. cache miss) Πολύ συχνά (κάθε 5-6 εντολές) το πρόγραμμα παίρνει αποφάσεις που αλλάζουν τη ροή εκτέλεσης (διακλαδώσεις). Πόσες εντολές να εκτελέσει ο πυρήνας όταν δεν ξέρει προς τα πού θα αλλάξει η ροή του νήματος; 13
Σπρώχνοντας τα όρια του ILP Για να αξιοποιήσουμε το υλικό που επιτρέπει παράλληλη εκτέλεση εντολών πρέπει να επεκτείνουμε τον ταυτοχρονισμό (concurrency) του προγράμματος Πώς; Αλλάζοντας τη σειρά εκτέλεσης εντολών Αν η επόμενη εντολή περιμένει κάποιο αποτέλεσμα και η μεθεπόμενη είναι ανεξάρτητη, ας εκτελεστεί Πρόβλημα: πώς θα δίνουμε την εντύπωση σειριακής εκτέλεσης; Προβλέποντας τις διακλαδώσεις (branch predicion) οδηγεί σε εκτέλεση βασισμένη σε εικασίες (speculaive execuion) 14
Δυναμικός χρονοπρογραμματισμός Παράδειγμα lw $t0, 20($s2) addu $t1, $t0, $t2 subu $s4, $s4, $t3 slti $t5, $s4, 20 Η subu μπορεί να ξεκινήσει όσο η addu περιμένει την lw Καλύτερος από στατικό χρονοπρογραμματισμό δεν μπορούν να προβλεφθούν όλες οι καθυστερήσεις (π.χ. αστοχίες κρυφής μνήμης) κάποιες διακλαδώσεις δεν μπορούν να προβλεφθούν πριν την εκτέλεση (π.χ. εξάρτηση από τις τιμές δεδομένων) ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 15
Κίνδυνοι δεδομένων Εξάρτηση δεδοµένων (Data-dependence) r 3 r 1 op r 2 Read-after-Write r 5 r 3 op r 4 (RAW) hazard Αντί-εξάρτηση (Anti-dependence) r 3 r 1 op r 2 Write-after-Read r 1 r 4 op r 5 (WAR) hazard Εξάρτηση αποτελέσµατος (Output-dependence) r 3 r 1 op r 2 Write-after-Write r 3 r 6 op r 7 (WAW) hazard Eξαρτήσεις δεδομένων υπάρχουν και μέσω μνήμης, αλλά είναι δύσκολο να ελεγχθούν ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 16
Παράδειγμα χρονοπρογραμματισμού I 1 DIVD f6, f6, f4 I 2 LD f2, 45(r3) I 1 I 2 I 3 MULTD f0, f2, f4 I 4 DIVD f8, f6, f2 I 5 SUBD f10, f0, f6 I 3 I 4 I 6 ADDD f6, f8, f2 I 5 Έγκυρες διατάξεις: σε σειρά I 1 I 2 I 3 I 4 I 5 I 6 I 6 εκτός σειράς εκτός σειράς I 2 I 1 I 3 I 4 I 5 I 6 I 1 I 2 I 3 I 5 I 4 I 6 RAW Hazards WAR Hazards WAW Hazards ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 17
Μετονομασία καταχωρητών Οι WAR, WAW εξαρτήσεις μεταξύ εντολών δέν είναι πραγματικές! add r1, r2, 10 mul r3, r1, 10 add r1, r4, 20 sub r5, r1, 20 add ra, r2, 10 mul rb, ra, 10 add rc, r4, 20 sub rd, rc, 20 Ονομάζεται register renaming Απλά δεν έχουμε αρκετούς καταχωρητές! Αν αλλάξουμε τα ονόματα των καταχωρητών το πρόβλημα λύνεται Παράλληλα Συστήματα 2012 18
Μετονομασία καταχωρητών Η αλλαγή ονομάτων λύνει όλους τους κινδύνους WAW, WAR Γιατί δεν το κάνει ο μεταφραστής ήδη; δεν υπάρχουν άλλοι καταχωρητές ορατοί από τον μεταφραστή (σε επίπεδο αρχιτεκτονικής) σκεφτείτε την κωδικοποίηση εντολών αλλά το αφαιρετικό επίπεδο μικρο- αρχιτεκτονικής μπορεί να έχει περισσότερους καταχωρητές και να αλλάζει τα ονόματα των καταχωρητών αρχιτεκτονικής κατά την αποκωδικοποίηση εντολών ΠΛΕ 027 Μικροεπεξεργαστές 2011-2012 19
Εκτέλεση εκτός σειράς Πώς διαφυλάσεται η (αρχική) σειρά εκτέλεσης; Η εκτέλεση μιας εντολής χωρίζεται σε 3 φάσεις: σε εξέλιξη (έχει ξεκινήσει) dispatched ολοκληρώθηκε (completed) δεσμεύτηκε (commi ed, reired) Εντολές που έχουν ολοκληρωθεί, έχουν κάνει αλλαγές και τα αποτελέσματά τους μπορούν να χρησιμοποιηθούν από επόμενες εντολές αλλά οι αλλαγές δεν φαίνονται έξω από το νήμα Το στάδιο δέσμευσης, γίνεται με τη σειρά του προγράμματος οι αλλαγές είναι πλέον ορατές Παράλληλα Συστήματα 2012 20
Δύο όψεις (states) της μηχανής Architectural state αλλάζει μόνο από δεσμευμένες εντολές η επίσημη κατάσταση του νήματος περιλαμβάνει τους καταχωρητές και τη κύρια μνήμη Εικαζόμενη (speculaive) state αλλάζει όταν η εκτέλεση μιας εντολής ολοκληρώνεται Υπάρχει «κρυφή» αποθήκευση μέσα στον πυρήνα Μπορεί να συνδιαστεί με τους επιπλέον καταχωρητές που χρειάζονται για μετονομασία καταχωρητών Παράλληλα Συστήματα 2012 21
Υλοποίηση 2 όψεων Δομή δεδομένων σε υλικό (κυκλική ουρά) reorder buffer Οι αποκωδικοποιημένες εντολές μπαίνουν με τη σειρά στην αρχή της ουράς Οι εντολές που φτάνουν στο τέλος της ουράς (και έχουν ολοκληρωθεί) θεωρούνται δεσμευμένες Τα αποτελεσματά τους «αντιγράφονται» στην architectural state και αφαιρούνται από την ουρά Αν μία εντολή φτάσει στο τέλος της ουράς και έχει αποτύχει (excepion) όλες οι εντολές της ουράς αποσύρονται και ξαναπροσκομίζουμε εντολές από την κατάλληλη διεύθυνση Παράλληλα Συστήματα 2012 22
Program Form Static program dynamic inst. Stream (trace) execution window completed instructions Processing Phase Dispatch/ dependences inst. Issue inst execution inst. Reorder & commit Credit: Moshovos U.Toronto
Αποθήκευση τιμών Για να υλοποιήσουμε τις δύο όψεις κρατάμε προσωρινές τιμές καταχωρητών από την στιγμή που ολοκληρώνεται η εκτέλεση μιας εντολής μέχρι να δεσμευτεί Είτε κρατάμε προσωρινές τιμές στο reorder buffer και ένα «επίσημο» αρχείο καταχωρητών (register file) ή ένα μεγάλο αρχείο καταχωρητών (physical register file) και ένα πίνακα με τις αντιστοιχίσεις των «αρχιτεκτονικών καταχωρητών» στους φυσικούς Είναι αδύνατο να κρατάμε αντίγραφο της κύριας μνήμης Πώς μπορούμε να χειριστούμε εντολές αποθήκευσης (store); Παράλληλα Συστήματα 2012 24
Store buffer Οι εντολές αποθήκευσης γράφουν τη διεύθυνση και τη τιμή στον store buffer και περιμένουν μέχρι η εντολή να δεσμευτεί πριν ξεκινήσουν την εγγραφή στη μνήμη Τι συμβαίνει όμως αν μια εντολή φόρτωσης (load) από τη μνήμη εκτελεστεί πριν αδειάσει ο store buffer; Αν η διεύθυνση της load είναι ίδια με τη store, η load παίρνει τα δεδομένα από το store buffer! Αλλιώς, επειδή η τιμή θα χρειαστεί σύντομα από κάποια άλλη εντολή, η load συχνά ξεπερνάει τη store και ξεκινάει τη προσπέλαση μνήμης πριν από αυτήν Παράλληλα Συστήματα 2012 25
Store buffer - λεπτομέρειες Μια εντολή store χρειάζεται δύο τιμές: την τιμή του καταχωρητή που αποθηκεύεται και τη διεύθυνση (συνήθως το άθροισμα ενός καταχωρητή και μιας σταθεράς) Μπορεί η μία από τις δύο τιμές να αργεί να υπολογιστεί γιατί εξαρτάται από μια αλυσίδα εντολών Πώς θα ξέρουν επόμενες load τη διεύθυνση ή την τιμή; Συντηρητικά, μια load πρέπει να περιμένει όλες τις προηγούμενες store που δεν έχουν διεύθυνση αλλά μερικοί επεξεργαστές μπορεί να επιτρέψουν τη load να προσπελάσει τη μνήμη και μετά ελέγχουν για λάθη! Παράλληλα Συστήματα 2012 26
In- Order Fetch In- Order Decode and Register Renaming In- Order Commit Out- of- Order Execuion Out- of- Order Compleion