Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Ενότητα 2 η : Στοιχεία Αρχιτεκτονικής Υπολογιστών
Α. Μερική Επικάλυψη Μηχανισμός μερικής επικάλυψης εντολών Εξαρτήσεις Κίνδυνοι (hazards) Παροχέτευση Πρόβλεψη διακλαδώσεων Μερική επικάλυψη σε μονάδες εκτέλεσης Επαναχρησιμοποίηση υπομονάδων Χρόνος ολοκλήρωσης μιας εκτέλεσης Ρυθμός επανάληψης διαδοχικών εκτελέσεων
Επικάλυψη Εντολών Διαχωρισμός σε φάσεις ίσης διάρκειας που υλοποιούνται σε υπομονάδες του επεξεργαστή Εισαγωγή απαιτούμενων καταχωρητών μεταξύ των υπομονάδων διαδοχικών φάσεων (βαθμίδων) Αντιμετώπιση κινδύνων Υποστήριξη μηχανισμού παγώματος
Απόδοση Επικάλυψης Βελτίωση στο χρόνο ολοκλήρωσης μιας εντολής; Όχι! (Το αντίθετο πιο πιθανό!) Ρυθμός ολοκλήρωσης εντολών Επιτάχυνση ρυθμού ολοκλήρωσης εντολών Ιδανική απόδοση μερικής επικάλυψης σε μια συγκεκριμένη αρχιτεκτονική Μη ιδανική απόδοση λόγω κινδύνων
Κίνδυνοι Εξαρτήσεων από Δεδομένα
Παροχέτευση
Επιτυχημένη Παροχέτευση
Αποτυχημένη Παροχέτευση
Πάγωμα
Κίνδυνοι Διαδικασιακών Εξαρτήσεων Πάγωμα επικάλυψης μέχρι την εκτέλεση της διακλάδωσης Πρόβλεψη και εκκένωση (flush) της ΜΕΔ σε αποτυχία πρόβλεψης Η κατάσταση του επεξεργαστή δεν αλλάζει πριν την εκτέλεση της διακλάδωσης Εκτέλεση στη φάση αποκωδικοποίησης Χρήση θέσεων καθυστέρησης (branch delay slots)
Επικάλυψη σε Μονάδες Εκτέλεσης Πολλών Κύκλων Κύκλος Μηχανής Εντολή 1 2 3 4 5 6 7 8 9 10 11 Mul.d F0,F4,F6 IF ID M1 M2 M3 M4 M5 M6 M7 MEM WB Χρόνος καθυστέρησης (latency) ο χρόνος που πρέπει να μεσολαβήσει μέχρι μια άλλη εξαρτημένη από αυτήν εντολή Ρυθμός επανάληψης (repeat rate) η συχνότητα με την οποία ξεκινούν εκτέλεση διαδοχικές παρόμοιες εντολές
Προβλήματα Εκτέλεσης Πολλαπλών Κύκλων Πιθανοί κίνδυνοι δομικών εξαρτήσεων στη μονάδα εκτέλεσης Πιθανή ολοκλήρωση εκτός σειράς, με: Κινδύνους δομικών εξαρτήσεων στο ΦΚ Κινδύνους εξαρτήσεων από δεδομένα τύπου ΕΜΕ Συχνά παγώματα και πιο πολύπλοκος μηχανισμός παροχέτευσης Αντιμετώπιση ειδικών περιπτώσεων;
Αποφυγή Δομικών Εξαρτήσεων στη Μονάδα Εκτέλεσης Επικάλυψη των φάσεων εκτέλεσης ρυθμός επανάληψης = 1 εντολή ανά κύκλο μηχανής Αντιγραφή υπομονάδων για να αποφευχτεί επαναχρησιμοποίησή τους Ισοστάθμιση χρόνου / κόστους συχνότητα εμφάνισης της εντολής βέλτιστος ρυθμός επανάληψης
Βελτιστοποίηση Επικάλυψης στην Εκτέλεση Από τον αλγόριθμο εκτέλεσης της εντολής αντιστοιχίζουμε φάσεις σε υπομονάδες: Πίνακας δέσμευσης (reservation table) 1 2 3 4 5 6 7 A X X X B X X C X X D X Διάνυσμα σύγκρουσης (collision vector) 0 1 0 1 0 1
Διάγραμμα Καταστάσεων και Μέγιστος Ρυθμός Επανάληψης Αρχική κατάσταση = διάνυσμα σύγκρουσης Για ξεκίνημα εντολής ν κύκλους αργότερα: νέα κατάσταση = (διάνυσμα παρούσας κατάστασης << ν) OR διάνυσμα σύγκρουσης σύνδεσε τις καταστάσεις με ετικέτα ν, και τη νέα με την αρχική με ετικέτα Ν Επανέλαβε για κάθε δυνατό ν και κάθε νέα κατάσταση Βρες τον κύκλο με το μέγιστο ρυθμό επανάληψης
Παράδειγμα 7 7 7 1 0 1 0 1 0 1 5 5 1 1 1 1 1 1 7 3 3 1 1 0 1 0 1 1 1 1 1 0 1 5 Μέγιστος ρυθμός επανάληψης: 2 πράξεις σε 8cc ή 1/4
Βελτίωση Μέγιστου Ρυθμού Επανάληψης Ο πίνακας δέσμευσης θέτει το άνω φράγμα στο ρυθμό επανάληψης Αν ο μέγιστος ρυθμός δε συμπίπτει με το άνω φράγμα: Τοποθέτησε υπομονάδες καθυστέρησης (καταχωρητές) σε κατάλληλα σημεία της μονάδας, ώστε να πάρεις ένα νέο πίνακα δέσμευσης (μεγαλύτερου εύρους), ο οποίος να δίνει ρυθμό επανάληψης ίσο με το άνω φράγμα
Παράδειγμα Άνω φράγμα ρυθμού επανάληψης: 1/3 1 2 3 4 5 6 7 8 A X X F F FD X B X F X F C X X F D X F Η χρήση της υπομονάδας Α την τρίτη φορά για κάθε πράξη πρέπει να καθυστερεί κατά 1 cc Εισαγωγή υπομονάδας καθυστέρησης μεταξύ Β και Α με κατάλληλο έλεγχο για τη χρήση της
Ολοκλήρωση εκτός Σειράς Πάγωμα εντολών που ζητούν ταυτόχρονη εγγραφή στο ΦΚ Ανίχνευση στη φάση ID: όλα τα παγώματα στην ίδια φάση Ανίχνευση μόλις ζητηθεί ταυτόχρονη εγγραφή: πιο εύκολη Ανίχνευση εγγραφής στον ίδιο καταχωρητή πάγωμα της εντολής που ακολουθεί ακύρωση εγγραφής της πρώτης
Ενσωμάτωση Υπομονάδων Εκτέλεσης με/χωρίς Επικάλυψη
Παγώματα σε Υπομονάδες Κινητής Υποδιαστολής MIPS
Επικάλυψη στον MIPS R4000 Superpipelining:
Παροχέτευση στον R4000
Διακλαδώσεις στον R4000
Απόδοση Επικάλυψης στον R4000
Β. Εκμετάλλευση Παραλληλισμού Εντολών Εκμετάλλευση παραλληλίας εντολών (ILP): Στατική δρομολόγηση για προσαρμογή στις δυνατότητες της αρχιτεκτονικής Δυναμική δρομολόγηση για εκτέλεση ε- κτός σειράς Βελτιωμένοι αλγόριθμοι πρόβλεψης διακλαδώσεων Υποθετική εκτέλεση Υπερβαθμωτή εκτέλεση και πολλαπλές ροές ελέγχου
Σειρά Εκτέλεσης Εντολών Η σειρά εκτέλεσης περιορίζεται από τις εξαρτήσεις μεταξύ των εντολών: Ldc1 $f6,34($2) Ldc1 $f2,45($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d$f6,$f8,$f2 Η αρχιτεκτονική δεν παραβιάζει τις εξαρτήσεις, αλλά μπορεί να διευκολύνει την εκτέλεση!
Στατική Δρομολόγηση Εντολών Περιορισμένες διευκολύνσεις από τον επεξεργαστή Εκμετάλλευση ILP μέσα από βελτιστοποιήσεις του μεταγλωττιστή Οι εντολές εκτελούνται με τη σειρά που προσκομίζονται Πάγωμα για όσους κινδύνους δε μπορεί να αντιμετωπίσει ο επεξεργαστής
Δυναμική Δρομολόγηση Εντολών Ειδικό υλικό παρακολουθεί την εκτέλεση κάθε εντολής που προσκομίζεται Οι εντολές εκτελούνται όταν είναι έτοιμες για εκτέλεση Τα τελούμενα εισόδου είναι διαθέσιμα Η υπομονάδα εκτέλεσης είναι ελεύθερη Η αποθήκευση αποτελέσματος γίνεται ε- ντός ή εκτός σειράς;
Αλγόριθμοι Δυναμική δρομολόγηση βασισμένη στον πίνακα παρακολούθησης (scoreboard) CDC6600 (Thornton/Cray 1964) Δυναμική δρομολόγηση βασισμένη στους σταθμούς δέσμευσης (reservation stations) IBM S/360 Model 91 (Tomasulo/Amdahl 1965)
Σταθμοί Δέσμευσης (ή Αλγόριθμος Tomasulo) Οι σταθμοί δέσμευσης (reservation stations) υποδεικνύουν τις υπομονάδες από τις οποίες αναμένονται τα τελούμενα εισόδου που δε βρίσκονται ακόμα στο ΦΚ Μια εντολή μπορεί να μπει στη φάση εκτέλεσης μόλις τα τελούμενα που χρειάζεται γίνουν διαθέσιμα μέσω παροχέτευσης Εφ όσον τα τελούμενα προωθούνται μέσω παροχέτευσης, δεν εμφανίζονται κίνδυνοι από εξαρτήσεις ΕΜΕ και ΕΜΑ
Υλοποίηση Σταθμών Κατάσταση υπομονάδων εκτέλεσης Busy: Υπομονάδα απασχολημένη Op: Λειτουργία που εκτελεί η υπομονάδα Qj,Qk: Υπομονάδες που παράγουν τα δεδομένα εισόδου (ή 0 για διαθέσιμες τιμές) Vj,Vk: Τιμές δεδομένων εισόδου Α: Διευθύνσεις προσπέλασης μνήμης Κατάσταση εγγραφής καταχωρητών
MIPS και Αλγόριθμος Tomasulo
Υλοποίηση Ελέγχου Tomasulo (1) Έκδοση FP: wait until Station r empty if (RegisterStat[rs].Qi 0) { RS[r].Qj := RegisterStat[rs].Qi; } else { RS[r].Vj := Regs[rs]; RS[r].Qj := 0; } if (RegisterStat[rt].Qi 0) { RS[r].Qk := RegisterStat[rt].Qi; } else {RS[r].Vk := Regs[rt]; RS[r].Qk := 0; } RS[r].Busy := Y; RegisterStat[rd].Qi := r;
Υλοποίηση Ελέγχου Tomasulo (2) Έκδοση Load/Store: wait until Buffer r empty if (RegisterStat[rs].Qi 0) { RS[r].Qj := RegisterStat[rs].Qi; } else { RS[r].Vj := Regs[rs]; RS[r].Qj := 0; } RS[r].A := imm; RS[r].Busy := Y; Load : RegisterStat[rt].Qi := r; Store: if (RegisterStat[rt].Qi 0) { RS[r].Qk := RegisterStat[rt].Qi; } else {RS[r].Vk := Regs[rt]; RS[r].Qk := 0; }
Υλοποίηση Ελέγχου Tomasulo (3) Εκτέλεση FP: wait until (RS[r].Qj = 0) && (RS[r].Qk = 0) Εκτέλεση Load (1 ο βήμα)/store: wait until (RS[r].Qj = 0) && (r is head of queue) RS[r].A := RS[r].Vj + RS[r].A; Εκτέλεση Load (2 ο βήμα): wait until step 1 complete Read from MEM[RS[r].A]
Υλοποίηση Ελέγχου Tomasulo (4) Αποθήκευση αποτελέσματος FP/Load: wait until execution complete && CDB available x:(if (RegisterStat[x].Qi = r) { Regs[x] := result; RegisterStat[x].Qi := 0; }); x:(if (RS[x].Qj = r) { RS[x].Vj := result; RS[x].Qj := 0; }); x:(if (RS[x].Qk = r) { RS[x].Vk := result; RS[x].Qk := 0; }); RS[r].Busy := N;
Υλοποίηση Ελέγχου Tomasulo (5) Αποθήκευση αποτελέσματος Store: wait until execution complete && RS[r].Qk = 0 Store RS[r].Vk into MEM[RS[r].A]; RS[r].Busy := N;
Παράδειγμα Εντολή Κατάσταση εντολής Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Όνομα Κατάσταση υπομονάδων εκτέλεσης Busy Op Vj Vk Qj Qk A Load1 N Load2 Y Load 44+Regs[3] Add1 Y Sub Mem[32+Regs[2]] Load2 Add2 Y Add Add1 Load2 Add3 N Mult1 Y Mul Regs[f4] Load2 Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Load2 Add2 Add1 Mult2
Παράδειγμα Εντολή Ldc1 Ldc1 Mul.d Sub.d Div.d Add.d Όνομα Load1 Load2 Add1 Add2 Add3 Mult1 Mult2 Υπομονάδα cc0 $f6,32($2) $f2,44($3) $f0,$f2,$f4 $f8,$f6,$f2 $f10,$f0,$f6 $f6,$f8,$f2 Κατάσταση εντολής Έκδοση Εκτέλεση Αποθήκευση Κατάσταση υπομονάδων εκτέλεσης Busy Op Vj Vk Qj Qk A N Ν Ν Ν N Ν Ν Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30
Παράδειγμα Εντολή Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Όνομα Κατάσταση εντολής Έκδοση Εκτέλεση Αποθήκευση Κατάσταση υπομονάδων εκτέλεσης Busy Op Vj Vk Qj Qk A Load1 Υ Load Regs[2] Load2 Ν Add1 Ν Add2 Ν Add3 N Mult1 Ν Mult2 Ν Υπομονάδα cc1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Load1
Παράδειγμα Εντολή Υπομονάδα Load2 Load1 cc2 Κατάσταση εντολής Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Όνομα Κατάσταση υπομονάδων εκτέλεσης Busy Op Vj Vk Qj Qk A Load1 Y Load 32+Regs[2] Load2 Y Load Regs[3] Add1 N Add2 N Add3 N Mult1 N Mult2 N Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 Y Load 32+Regs[2] Load2 Y Load 44+Regs[3] Add1 N Add2 N Add3 N Mult1 Y Mul Regs[f4] Load2 Mult2 N Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Load2 Load1 cc3
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Busy Op Vj Vk Qj Qk A Όνομα Load1 Y Load 32+Regs[2] Load2 Y Load 44+Regs[3] Add1 Y Sub Load1 Load2 Add2 N Add3 N Mult1 Y Mul Regs[f4] Load2 Mult2 N Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Load2 Load1 Add1 cc4
Παράδειγμα Κατάσταση εντολής Έκδοση Εκτέλεση Αποθήκευση Εντολή Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 Y Load 44+Regs[3] Add1 Y Sub Mem[32+Regs[2]] Load2 Add2 N Add3 N Mult1 Y Mul Regs[f4] Load2 Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Load2 Add1 Mult2 cc5
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 Y Load 44+Regs[3] Add1 Y Sub Mem[32+Regs[2]] Load2 Add2 Y Add Add1 Load2 Add3 N Mult1 Y Mul Regs[f4] Load2 Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Load2 Add2 Add1 Mult2 cc6
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 Y Sub Mem[32+Regs[2]] Mem[44+Regs[3]] Add2 Y Add Mem[44+Regs[3]] Add1 Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Add1 Mult2 cc7
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 Y Sub Mem[32+Regs[2]] Mem[44+Regs[3]] Add2 Y Add Mem[44+Regs[3]] Add1 Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Add1 Mult2 cc8
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 Y Sub Mem[32+Regs[2]] Mem[44+Regs[3]] Add2 Y Add Mem[44+Regs[3]] Add1 Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Add1 Mult2 cc9
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 N Add2 Y Add Mem[ ]-Mem[ ] Mem[44+Regs[3]] Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Mult2 cc10
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 N Add2 Y Add Mem[ ]-Mem[ ] Mem[44+Regs[3]] Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Mult2 cc11
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 N Add2 Y Add Mem[ ]-Mem[ ] Mem[44+Regs[3]] Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Add2 Mult2 cc12
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 N Add2 N Add3 N Mult1 Y Mul Mem[44+Regs[3]] Regs[f4] Mult2 Y Div Mem[32+Regs[2]] Mult1 Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult1 Mult2 cc13
Παράδειγμα Κατάσταση εντολής Εντολή Έκδοση Εκτέλεση Αποθήκευση Ldc1 $f6,32($2) Ldc1 $f2,44($3) Mul.d $f0,$f2,$f4 Sub.d $f8,$f6,$f2 Div.d $f10,$f0,$f6 Add.d $f6,$f8,$f2 Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk A Load1 N Load2 N Add1 N Add2 N Add3 N Mult1 N Mult2 Y Div Mem[ ] Regs[f4] Mem[32+Regs[2]] Κατάσταση εγγραφής καταχωρητών $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 Υπομονάδα Mult2 cc14...
Περιορισμοί/Προβλήματα Διαθέσιμη παραλληλία στην εκτέλεση των εντολών Μέγεθος ουράς εντολών (παραθύρου έκδοσης issue window) Αριθμός και είδος υπομονάδων εκτέλεσης Δυνατότητες παροχέτευσης μεταξύ υπομονάδων
Πέρα από την Εκτέλεση Εκτός Σειράς Δυναμική πρόβλεψη διακλαδώσεων Ιστορία διακλάδωσης Πρόβλεψη πολλαπλών επιπέδων Υποθετική εκτέλεση Διαχείριση εντολών μετά από μία πρόβλεψη διακλάδωσης Υπερβαθμωτή ΜΕΔ Πολλαπλές ολικά επικαλυπτόμενες εντολές Περιορισμοί στην εκμετάλλευση ILP
Πρόβλεψη Διακλαδώσεων σε Δύο Επίπεδα Η συμπεριφορά της ίδιας διακλάδωσης σε διαδοχικές εκτελέσεις της πριν την παρούσα Η συμπεριφορά διαδοχικών διακλαδώσεων που εκτελούνται πριν την παρούσα Παράδειγμα: if (d == 0) d = 1; if (d == 1)... bne $1,$0,L1 addiu $1,$0,1 L1: addiu $3,$1,-1 bne $3,$0,L2 L2:
Υλοποιώντας το Δεύτερο Επίπεδο
Συγκριτική Απόδοση
Εναλλαγή Μεθόδων Πρόβλεψης Υλοποίηση πολλαπλών μεθόδων πρόβλεψης Επιλογή μιας μεθόδου δυναμικά, ανάλογα με την επιτυχία πρόβλεψης
Υποθετική Εκτέλεση Επιτρέπει την εκτέλεση εντολών που πιθανά να μην πρέπει να εκτελεστούν Απαραίτητη για συνδυασμό πρόβλεψης διακλαδώσεων με δυναμική δρομολόγηση εντολών για εκτέλεση εκτός σειράς Επιτηρεί την μεταβολή της κατάστασης του επεξεργαστή με βάση τις εκτελέσεις των διακλαδώσεων με τη σωστή σειρά
Απόσυρση Εντολών (Commit) Η τελευταία φάση στον κύκλο εντολής, που διαχωρίζεται από τη φάση εκτέλεσης Η απόσυρση γίνεται με την αρχική σειρά των εντολών Ακριβής αντιμετώπιση ειδικών περιπτώσεων Χρήση πίνακα επαναδιάταξης εντολών (reorder buffer) Ένα αποτέλεσμα εκτέλεσης αποθηκεύεται προσωρινά στον πίνακα επαναδιάταξης
MIPS με Υποθετική Εκτέλεση
Παράδειγμα Κατάσταση υπομονάδων εκτέλεσης Όνομα Busy Op Vj Vk Qj Qk Dest A Load1 Load2 Add1 Add2 Add3 N N N N N Mult1 N Mul Mem[45+Regs[3]] Regs[F4] #3 Mult2 Y Div Mem[34+Regs[2]] #3 #5 Πίνακας επαναδιάταξης # Busy Εντολή Κατάσταση Προορισμός Τιμή 1 N Ldc1 $f6,34($2) Commit F6 Mem[34+Regs[2]] 2 N Ldc1 $f2,45($3) Commit F2 Mem[45+Regs[3]] 3 Y Mul.d $f0,$f2,$f4 Write result F0 #2 x Regs[F4] 4 Y Sub.d $f8,$f6,$f2 Write result F8 #1 - #2 5 Y Div.d $f10,$f0,$f6 Execute F10 6 Y Add.d $f6,$f8,$f2 Write result F6 #4 + #2 Κατάσταση εγγραφής καταχωρητών Πεδίο $f0 $f2 $f4 $f6 $f8 $f10 $f12 $f30 #/Busy 3/Y -/N -/N 6/Y 4/Y 5/Y -/N -/N
Μετονομασία Καταχωρητών Χρήση μεγάλου αριθμού φυσικών καταχωρητών για προσωρινή απεικόνιση των καταχωρητών της αρχιτεκτονικής Μια προσωρινή απεικόνιση: οριστικοποιείται στην απόσυρση της αντίστοιχης διακλάδωσης ακυρώνεται σε αποτυχημένη πρόβλεψη Τα δεδομένα αποθηκεύονται μόνο στο ΦΚ, όχι στον πίνακα επαναδιάταξης
Υπερβαθμωτή ΜΕΔ Περισσότερες από μία διαδοχικές εντολές ανακαλούνται ταυτόχρονα από τη μνήμη, αποκωδικοποιούνται ταυτόχρονα και ετοιμάζονται για εκτέλεση ταυτόχρονα Αντιμετώπιση κινδύνων από εξαρτήσεις μεταξύ εντολών που επεξεργαζόμαστε ταυτόχρονα, και σύμφωνα με τη σωστή σειρά τους στον κώδικα!
Υπερβαθμωτή ΜΕΔ με Υποθετική Εκτέλεση Μετά την εκτέλεσή τους, πολλαπλές εντολές αποσύρονται ταυτόχρονα Περισσότερο πολύπλοκο υλικό Μεγαλύτερη ανάγκη επιτυχίας πρόβλεψης, ώστε να μη χάνεται το κέρδος από την υπερβαθμωτή εκτέλεση
Πού Σταματάμε; ILP που διαθέτουν τα προγράμματα Υλικό, πχ μέγεθος πίνακα επαναδιάταξης, αριθμός υπομονάδων εκτέλεσης, μέγεθος παραθύρου εντολών που βλέπει ο επεξεργαστής Πραγματική δυνατότητα πρόβλεψης διακλαδώσεων Δυσκολία αντιμετώπισης κινδύνων από εξαρτήσεις μνήμης
Αρχιτεκτονική i3/i5/i7 (Nehalem)
Αρχιτεκτονικές VLIW & Στατική Δρομολόγηση Εντολών Κωδικοποίηση πολλών επιμέρους εντολών σε μία Πολύ Μεγάλη Λέξη Εντολής (Very Long Instruction Word) Επεξεργαστές πολλαπλών μονάδων εκτέλεσης Παράλληλες εντολές Στατική δρομολόγηση εντολών από το μεταγλωττιστή Έλλειψη ελέγχου εξαρτήσεων μεταξύ εντολών της ίδιας λέξης
Οργάνωση Αρχιτεκτονικών VLIW Πολλές μονάδες εκτέλεσης 5 ή περισσότερες παράλληλες εκτελέσεις, για μικρότερο εύρος προτιμάται η υπερβαθμωτή αρχιτεκτονική με δυναμική δρομολόγηση Οι επιμέρους εντολές εκτελούνται όπως έρχονται από τη μνήμη εντολών Συνήθως οι επιμέρους εντολές εκτελούνται στις ίδιες κάθε φορά μονάδες εκτέλεσης
Εντολές VLIW Παράδειγμα οργάνωσης επιμέρους εντολών: οι δύο πρώτες εντολές είναι εντολές προσπέλασης μνήμης οι δύο επόμενες εντολές είναι κινητής υποδιαστολής η τελευταία εντολή είναι σταθερής υποδιαστολής Αν δεν μπορούμε να συμπληρώσουμε τις επιμέρους εντολές, αυτές μένουν κενές!
Παραγωγή Κώδικα Υψηλού ILP Συνήθως κώδικας υψηλού ILP προκύπτει από κατάλληλη δρομολόγηση βρόχων Ανίχνευση παράλληλων βρόχων Βελτιστοποιητικοί μετασχηματισμοί βρόχων που αρχικά δεν είναι παράλληλοι Δρομολόγηση εντολών βρόχου μετά από Ξεδίπλωμα ενός αριθμού επαναλήψεων Συμβολικό ξεδίπλωμα Δρομολόγηση ενός δρόμου
Ξεδίπλωμα Βρόχων Χωρίς δρομολόγηση: ldc1 F0,0(R1) ; t=1 add.d F4,F0,F2 ; t=3 sdc1 F4,0(R1) ; t=6 ldc1 F0,-8(R1) ; t=7 add.d F4,F0,F2 ; t=9 sdc1 F4,-8(R1) ; t=12 ldc1 F0,-16(R1) ; t=13 add.d F4,F0,F2 ; t=15 sdc1 F4,-16(R1) ; t=18 ldc1 F0,-24(R1) ; t=19 add.d F4,F0,F2 ; t=21 sdc1 F4,-24(R1) ; t=24 daddiu R1,R1,-32 ; t=25 bne R1,R2,Loop ; t=27 ldc1 F0,0(R1) ; t=29 Με δρομολόγηση: ldc1 F0,0(R1) ; t=1 ldc1 F6,-8(R1) ; t=2 ldc1 F10,-16(R1); t=3 ldc1 F14,-24(R1); t=4 add.d F4,F0,F2 ; t=5 add.d F8,F6,F2 ; t=6 add.d F12,F10,F2 ; t=7 add.d F16,F14,F2 ; t=8 sdc1 F4,0(R1) ; t=9 sdc1 F8,-8(R1) ; t=10 daddiu R1,R1,-32 ; t=11 sdc1 F12,16(R1) ; t=12 bne R1,R2,Loop ; t=13 sdc1 F16,8(R1) ; t=14 ldc1 F0,0(R1) ; t=15
Υπερβαθμωτή Δρομολόγηση Εκτέλεση μιας εντολής σταθερής και μιας εντολής κινητής υποδιαστολής ανά cc: ldc1 F0,0(R1) ; t=1 ldc1 F6,-8(R1) ; t=2 ldc1 F10,-16(R1) add.d F4,F0,F2 ; t=3 ldc1 F14,-24(R1) add.d F8,F6,F2 ; t=4 ldc1 F18,-32(R1) add.d F12,F10,F2 ; t=5 sdc1 F4,0(R1) add.d F16,F14,F2 ; t=6 sdc1 F8,-8(R1) add.d F20,F18,F2 ; t=7 sdc1 F12,-16(R1) ; t=8 daddiu R1,R1,-40 ; t=9 sdc1 F16,16(R1) ; t=10 bne R1,R2,Loop ; t=11 sdc1 F20,8(R1) ; t=12 ldc1 F0,0(R1) ; t=13
Δρομολόγηση VLIW Με βάση την προαναφερθείσα οργάνωση των επιμέρους εντολών: (Διακλαδώσεις χωρίς καθυστέρηση) ldc1 F0,0(R1) ldc1 F6,-8(R1) ldc1 F10,-16(R1) ldc1 F14,-24(R1) ldc1 F18,-32(R1) ldc1 F22,-40(R1) add.d F4,F0,F2 add.d F8,F6,F2 ldc1 F26,-48(R1) add.d F12,F10,F2 add.d F16,F14,F2 add.d F20,F18,F2 add.d F24,F22,F2 sdc1 F4,0(R1) sdc1 F8,-8(R1) add.d F28,F26,F2 sdc1 F12,-16(R1) sdc1 F16,-24(R1) daddiu R1,R1,-56 sdc1 F20,24(R1) sdc1 F24,16(R1) sdc1 F28,8(R1) bne R1,R2,Loop ldc1 F0,0(R1) ldc1 F6,-8(R1)
Παράλληλοι Βρόχοι Εξαρτήσεις εντολών & επαναλήψεων βρόχου: for (i=1; i<=100; i=i+1) { A[i+1] = A[i] + B[i]; B[i+1] = C[i] + A[i+1]; } for (i=1; i<=100; i=i+1) { A[i] = A[i] + B[i+1]; B[i+1] = C[i] + D[i]; } Σειριακός βρόχος Παράλληλος βρόχος
Παράλληλοι Βρόχοι Μετασχηματισμοί βρόχων που μπορούν να γίνουν παράλληλοι: for (i=1; i<=100; i=i+1) { A[i] = A[i] + B[i]; B[i+1] = C[i] + D[i]; } A[1] = A[1] + B[1]; for (i=1; i<=99; i=i+1) { B[i+1] = C[i] + D[i]; A[i+1] = A[i+1] + B[i+1]; } B[101] = C[100] + D[100]; Σειριακός βρόχος Παράλληλος βρόχος
Έλεγχος ΜΚΔ (GCD) Έστω δύο αναφορές στο ίδιο διάνυσμα Χ: Χ[a*i+b], X[c*i+d] Αν υπάρχει εξάρτηση μεταξύ των δύο αναφορών, τότε πρέπει: (d-b) mod GCD(c,a) = 0 Αναγκαία συνθήκη, αλλά όχι και ικανή: μπορούμε να συμπεράνουμε ότι δεν υπάρχει εξάρτηση, αλλά όχι το ανάποδο!
Συμβολικό Ξεδίπλωμα Βρόχων
Παράδειγμα Αρχικός βρόχος: Νέος βρόχος: Loop: ldc1 $f0,0($1) add.d $f4,$f0,$f2 sdc1 $f4,0($1) addiu $1,$1,-8 bne $1,$2,Loop <prologue> Loop: sdc1 $f4,0($1) add.d $f4,$f0,$f2 ldc1 $f0,-16($1) addiu $1,$1,-8 bne $1,$2,Loop <epilogue> Πώς προκύπτει μεγαλύτερο ILP;
Πραγματικό & Συμβολικό Ξεδίπλωμα
Καθολική Δρομολόγηση
Δρομολόγηση ενός Δρόμου
Superblock
Υποστήριξη από το Υλικό για Αύξηση ILP Βεβαιωμένη εκτέλεση Μετατροπή διαδικασιακά εξαρτημένων εντολών σε εντολές που εκτελούνται προαιρετικά Οι διαδικασιακές εξαρτήσεις γίνονται εξαρτήσεις από δεδομένα Στατική υποθετική εκτέλεση Ο μεταγλωττιστής παράγει ειδικές εντολές υποθετικής εκτέλεσης Το υλικό εξασφαλίζει την ορθότητα εκτέλεσης
Βεβαιωμένη Εκτέλεση Η συνθήκη διακλάδωσης αποθηκεύεται σε κάποιον καταχωρητή: Ειδικοί καταχωρητές βεβαίωσης cmp.ne p1=$8,$0 (p1) add $7,$8,$2 sw $7,0($1) Καταχωρητές γενικού σκοπού slti $5,$9,8 cmovz $7,$1,$5
Στατική Υποθετική Εκτέλεση Ο μεταγλωττιστής μετακινεί εντολές για εκτέλεση πριν από τη διακλάδωση από την οποία εξαρτώνται Ειδικές εντολές αγνοούν ή καθυστερούν τις ειδικές περιπτώσεις Ο μεταγλωττιστής μετακινεί εντολές φόρτωσης πριν από εντολές αποθήκευσης Ειδικές εντολές φόρτωσης οδηγούν σε έλεγχο επικάλυψης όταν γίνεται η αποθήκευση
Παράδειγμα (speculative load) Πηγαίος κώδικας C: if (A == 0) A = B; else A = A+4; Αρχική μετάφραση: lw $1,0($3) ;load A bnez $1,L1 ;test A lw $1,0($2) ;then clause (load B) j L2 ;skip else L1:addiu $1,$1,4 ;else clause (add 4 to A) L2:sw $1,0($3) ;store A
Παράδειγμα (speculative load) Απλή μετακίνηση εντολής φόρτωσης: lw $1,0($3) ;load A lw $14,0($2) ;speculative load B beqz $1,L2 ;test A L1:addiu $14,$1,4 ;else clause L2: sw $14,0($3) ;store A Ειδική περίπτωση χωρίς επάνοδο δεν πρέπει να τερματίζει το πρόγραμμα, αλλά να επιστρέφει κατάλληλη τιμή
Παράδειγμα (speculative load) Υλοποίηση με εντολή υποθετικής φόρτωσης και ειδική εντολή ελέγχου: lw $1,0($3) ;load A slw $14,0($2) ;speculative, no exception bnez $1,L1 ;test A specck 0($2) ;speculation check j L2 ;skip else L1:addiu $14,$1,4 ;else clause L2: sw $14,0($3) ;store A Ο έλεγχος μπορεί να υπονοηθεί με poison bits
Παράδειγμα (advanced load) Αρχικός κώδικας: sw $12,0($4) ;store lw $6,0($8) ;load sw $6,0($18) ;store Εντολή πρώιμης φόρτωσης και ελέγχου: lw.a $6,0($8) ;advanced load sw $12,0($4) ;store lw.c $6,0($8) ;check load sw $6,0($18) ;store Έλεγχος με κώδικα επαναφοράς
Προβλήματα Αρχιτεκτονικών VLIW Μεγάλος κώδικας Πολλαπλό ξεδίπλωμα βρόχων Κενές επιμέρους εντολές Συγχρονισμένη εκτέλεση επιμέρους εντολών Πάγωμα όλων των επιμέρους εντολών Μη φορητότητα κώδικα Ανάγκη εύρεσης υψηλού ILP
Υβριδικές Αρχιτεκτονικές Προσθήκη ελέγχου εξαρτήσεων και δρομολόγηση για εκτέλεση εκτός σειράς όχι για επιμέρους εντολές, η δρομολόγηση των οποίων παραμένει στην ευθύνη του μεταγλωττιστή Κατάλληλη κωδικοποίηση για φορητότητα κώδικα
Itanium
Γ. Θέματα Ιεραρχίας Μνήμης, Ε/Ε & Αρτηριών Κρυφή μνήμη Κύρια μνήμη Βελτιστοποιήσεις κρυφής μνήμης Κύρια μνήμη Ιδεατή μνήμη Βελτιστοποιήσεις κύριας και ιδεατής μνήμης Θέματα δευτερεύουσας μνήμης Συστήματα δίσκων Αρτηρίες διασύνδεσης Αρτηρίες διαχωρισμένης προσπέλασης
Απόδοση CPU έναντι DRAM Hennessy-Patterson
Κρυφή Μνήμη Μέσος χρόνος προσπέλασης = Χρόνος επιτυχούς προσπέλασης + Λόγος αποτυχίας Χρόνος προσπέλασης επόμενου επιπέδου Η σχεδίαση της κρυφής μνήμης γίνεται με σκοπό την ελαχιστοποίηση του μέσου χρόνου προσπέλασης Αυξημένη πολυπλοκότητα όταν υποστηρίζεται εκτέλεση εκτός σειράς
Μείωση Κόστους Αποτυχίας Πολλαπλά επίπεδα κρυφής μνήμης L2 και L3 επίπεδα Επιλογή δεδομένου από το μπλοκ Προηγείται το δεδομένο που ζητείται Προτεραιότητα στις εντολές φόρτωσης Έλεγχος για επικάλυψη διευθύνσεων Συγχώνευση στις αποθηκεύσεις Κρυφή μνήμη θυμάτων (victim cache)
Μείωση Λόγου Αποτυχίας Αύξηση μεγέθους μπλοκ Αύξηση μεγέθους μνήμης Αύξηση βαθμού συσχέτισης Ψευδοσυσχετιστική κρυφή μνήμη (pseudoassociative) Βελτιστοποιήσεις μεταγλωττιστή
Παραλληλισμός στην Κρυφή Μνήμη Nonblocking caches Οι προσπελάσεις συνεχίζονται σε μια αποτυχία μέχρι ενός αριθμού αποτυχιών Εκ των προτέρων προσκόμιση από το υλικό (hardware prefetching) Συνήθως σε εξωτερικό χώρο (stream buffer) Εκ των προτέρων προσκόμιση από το λογισμικό (software prefetching)
Βελτίωση Χρόνου Προσπέλασης σε Επιτυχία Μικρές και απλές κρυφές μνήμες Λογικές διευθύνσεις αντί για φυσικές Μεταγωγές περιβάλλοντος (context switches): Ακύρωση Διατήρηση κατάλληλης ετικέτας Πρόβλεψη δρόμου (way prediction) Μερική επικάλυψη προσπελάσεων Αποθήκευση χρήσιμων εντολών: κρυφές μνήμες ίχνους (trace caches)
Κύρια Μνήμη Οργάνωση χώρου διευθύνσεων Διαφύλλωση χαμηλής τάξης Τεχνολογία κατασκευής και διασύνδεσης με ΚΜΕ DIMM / SIMM SDRAM / DRAM DDR SDRAM RAMBUS / FSB
Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Παράδειγμα: Alpha 21264 Hennessy-Patterson
Παράδειγμα: AMD Opteron Hennessy-Patterson
Συστήματα Δευτερεύουσας Αποθήκευσης Εξέλιξη τεχνολογίας δίσκων Συστήματα RAID: Redundant Arrays of Inexpensive (Independent) Disks
Θέματα Αρτηριών Αρτηρία διαχωρισμένης προσπέλασης (split transaction bus)
Δ. Εισαγωγή στην Παράλληλη Επεξεργασία Επίπεδο Παραλληλισμού Από εντολές έως ανεξάρτητες διεργασίες Οργανώσεις Παράλληλων Αρχιτεκτονικών Συμμετρικοί, κατανεμημένης μνήμης Μέθοδοι Επικοινωνίας και Δίκτυα Μέθοδοι Συγχρονισμού Διανυσματικοί Πολυεπεξεργαστές Πολλαπλές Ροές Ελέγχου
Επίπεδο Παραλληλισμού ILP Μερική επικάλυψη, εκτέλεση εκτός σειράς, υπερβαθμωτή εκτέλεση και εκτέλεση VLIW Πολλαπλές ροές ελέγχου (ή νήματα) Από την ίδια ή διαφορετικές διεργασίες Εκμετάλλευση παραλληλισμού βρόχων και εντολών υψηλού επιπέδου Διανυσματικοί επεξεργαστές & επεξεργαστές γραφικών Πολλαπλές διεργασίες
Πολυεπεξεργαστές & Πολυυπολογιστές Πολυεπεξεργαστές: Πολλαπλοί επεξεργαστές που συνδέονται στον ίδιο χώρο διευθύνσεων μνήμης Κοινή μνήμη Πολυυπολογιστές: Ανεξάρτητοι υπολογιστές συνδεδεμένοι μεταξύ τους Κατανεμημένη μνήμη Κατανεμημένη κοινή μνήμη: πολυυπολογιστές που εμφανίζονται ως πολυεπεξεργαστές!
Ταξινόμηση Flynn SISD (Single Instruction - Single Data) Οι μονοεπεξεργαστές SIMD (Single Instruction - Multiple Data) Οι διανυσματικοί επεξεργαστές MISD (Multiple Instruction - Single Data) Μηχανές ροής δεδομένων MIMD (Multiple Instruction - Multiple Data) Οι συνηθισμένοι παράλληλοι επεξεργαστές
Προβλήματα Μνήμης Συνοχή κρυφών μνημών Το πρόβλημα των εγγραφών και πώς αυτές γίνονται ορατές σε άλλους επεξεργαστές Συνέπεια μνήμης Το πρόβλημα των εγγραφών και πότε αυτές γίνονται ορατές σε άλλους επεξεργαστές
Συγχρονισμός Παράλληλης Επεξεργασίας Η ανάγκη συγχρονισμού Βρόχος doacross Μέθοδοι συγχρονισμού Συγχρονισμός μεταξύ δύο παράλληλων επεξεργασιών Φράγμα Θέματα υλοποίησης Ατομικές μικρολειτουργίες Υποστήριξη από το σύνολο εντολών
Διανυσματικοί Υπολογιστές Παράλληλη επεξεργασία τύπου SIMD: Υπολογιστές που εκτελούν διανυσματικές πράξεις Από τον Cray και τον IBM 3090 Μέχρι τους πιο πρόσφατους μικροεπεξεργαστές που εκτελούν διανυσματικές εντολές για media processing
Επεξεργασία Πολλαπλών Ροών Ελέγχου Ροές ελέγχου (ή νήματα) από την ίδια ή διαφορετικές διεργασίες Διάφορα επίπεδα παραλληλισμού Blocked και interleaved Συνδυασμός υπερβαθμωτής εκτέλεσης και εκτέλεσης πολλαπλών ροών ελέγχου Παραγωγή κώδικα πολλαπλών ροών ελέγχου!