ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών (ΗΜΜΥ) HMMY 212 Οργάνωση Η/Υ και Μικροεπεξεργαστές Εαρινό Εξάμηνο, 2007 2 η Ενδιάμεση Εξέταση Λύσεις/Απαντήσεις Άσκηση 1: Διασωλήνωση 5 σταδίων Επεξεργαστής με πρόβλημα! (15 μονάδες) I. Χ1: Δεν μπορεί να γράψει στο αρχείο καταχωρητών. Έτσι οι εντολές τύπου R-type (registertype) που χρησιμοποιούν αποκλειστικά καταχωρητές θα αποτύχουν. Παράδειγμα κώδικα που θα αποτύχει: add $s1, $s2, $s3 Δεν μπορεί να γράψει στον $s1 Παράδειγμα κώδικα που θα δουλέψει χωρίς πρόβλημα: sw $s1, 0($s2) Διαβάζει τους $s1 και $s2 II. Χ2: Δεν μπορεί να προωθηθεί (forwarding) ο πρώτος τελεστής (operand) δεδομένων. Έτσι θα έχουμε πρόβλημα σε περίπτωση κινδύνου δεδομένων (data hazard) λόγω εξάρτησης δεδομένων από την προηγούμενη εντολή που γράφει το αποτέλεσμα σε καταχωρητή στο τέλος του τρίτου σταδίου διασωλήνωσης που χρειάζεται να διαβαστεί στην αρχή του τρίτου σταδίου διασωλήνωσης κατά τον επόμενο κύκλο εκτέλεσης (επόμενη εξαρτημένη εντολή). Κίνδυνος τύπου RAW hazard. Παράδειγμα κώδικα που θα αποτύχει: add $s1, $s2, $s3 add $s3, $s1, $s5 Εξάρτηση στον $s1 Παράδειγμα κώδικα που θα δουλέψει χωρίς πρόβλημα: add $s1, $s2, $s3 add $s3, $s5, $s2 Δεν υπάρχει εξάρτηση στον $s1 γιατί είναι ο δεύτερος και όχι ο πρώτος τελεστής. III. Χ3: Μεταπήδηση σε διεύθυνση μνήμης που καθορίζει εντολή διακλάδωσης τύπου branch εφόσον ισχύει (taken) δεν θα δουλέψει. Παράδειγμα κώδικα που θα αποτύχει: addi $s1, $zero, 4 addi $s2, $zero, 4 beq $s1, $s2, Label1 Το branch iσχύει. B Σελίδα 1 από 7
Παράδειγμα κώδικα που θα δουλέψει χωρίς πρόβλημα: addi $s1, $zero, 4 addi $s2, $zero, 10 beq $s1, $s2, Label1 Το branch δεν iισχύει, συνεχίζει το πρόγραμμα να εκτελείται στο PC+4, επόμενη εντολή. Άσκηση 2: Απόδοση διασωλήνωσης (15 μονάδες) I. Όταν γεμίσουν τα στάδια διασωλήνωσης: (1-f)Ν εντολές παίρνουν ένα κύκλο ρολογιού fn εντολές παίρνουν δύο κύκλους ρολογιού, ένα επιπλέον κύκλο καθυστέρησης (stall) μεταξύ του load και της εξαρτημένης εντολής. Ολικός αριθμός κύκλων = (1-f)N + 2fN + 4 (τέσσερα για την αρχική καθυστέρηση μέχρι να γεμίσουν όλα τα στάδια διασωλήνωσης) = Ν(1+f) + 4 Ολικός χρόνος εκτέλεσης = 10ns (Ν(1+f) + 4) II. Ας αγνοήσουμε τους πρώτους τέσσερις κύκλους για την αρχική καθυστέρηση μέχρι να γεμίσουν όλα τα στάδια διασωλήνωσης Επιλογή (α) : Χρόνος εκτέλεσης = 10ns ((1-f)N + 3fN) = (1+2f) 10ns N Ο αριθμός 3 είναι για το επιπλέον στάδιο ΜΕΜ2 που εισάγει καθυστέρηση Επιλογή (β) : 12ns ((1-f)N + 2fN) = (1+f) 12ns N Η επιλογή (α) είναι καλύτερη όταν (1+2f) 10ns N < (1+f) 12ns N 10 + 20f < 12 + 12f 8f < 2 ή f < ¼ Άσκηση 3: Διασωλήνωση προώθηση και κίνδυνοι (10 μονάδες) I. Ερώτηση 1: Λάθος, η μνήμη είναι χωρισμένη σε μνήμη εντολών και μνήμη δεδομένων για να μην υπάρξει περίπτωση δομικού κινδύνου. Ερώτηση 2 : Λάθος, μπορεί να συμβεί σε περίπτωση εξαιρέσεων (exceptions) Ερώτηση 3 : Λάθος, μπορεί να συμβούν περιπτώσεις stalls Ερώτηση 4 : Σωστό Ερώτηση 5 : Σωστό II. Τέσσερις περιπτώσεις: Καταχωρητής $s4: από sub φάση EX προς load φάση EX Καταχωρητής $s4: από sub φάση MEM προς add φάση EX Καταχωρητής $s8: από load φάση MEM προς add φάση EX Καταχωρητής $s7: από add φάση MEM προς store φάση MEM Σελίδα 2 από 7
Άσκηση 4: Διασωλήνωση προώθηση και απόδοση (20 + 10 Bonus μονάδες) I. Ο πίνακας έχει ως εξής: Εντολή Πηγή τελεστή 1 (source operand 1) Πηγή τελεστή 2 (source operand 2) 1 REG REG 2 BYPASS N/A 3 BYPASS N/A 4 REG REG 5 BYPASS N/A 6 BYPASS N/A 7 BYPASS REG II. Αριθμός κύκλων = 7 (εντολές) + 2 (καθυστερήσεις load-add) + 4 (αρχικά μέχρι να γεμίσει η διασωλήνωση) = 13 κύκλοι III. 2 κύκλοι, ένα περισσότερος από πριν IV. Αριθμός κύκλων = 7 (εντολές) + 4 (καθυστερήσεις load-add) + 4 (αρχικά μέχρι να γεμίσει η διασωλήνωση) = 15 κύκλοι V. Αρχικά: Με αλλαγές: 1 add $t2, $s1, $s3 2 lw $t1, 0($t2) 3 addi $t2, $t1, 7 4 add $t1, $s2, $s3 5 lw $t1, 0($t1) 6 addi $t1, $t1, 9 7 sub $t1, $t1, $t2 1 add $t2, $s1, $s3 2 lw $t1, 0($t2) 4 add $t11, $s2, $s3 5 lw $t11, 0($t11) 3 addi $t2, $t1, 7 6 addi $t11, $t11, 9 7 sub $t1, $t1, $t2 Μεταξύ εντολών 2 και 4 και 3 περιορίζουμε την καθυστέρηση λόγω αρχικού load-addi. Αριθμός κύκλων = 7 (εντολές) + 1 (καθυστερήσεις μεταξύ εντολών 5 και 6) + 4 (αρχικά μέχρι να γεμίσει η διασωλήνωση) = 12 κύκλοι Σελίδα 3 από 7
Άσκηση 5: Δυναμική πρόβλεψη διακλάδωσης (15 μονάδες) I. Πίνακας: Βρόγχος bne $s1,$zero,loop1 (taken (Τ)/not taken (NT)) Ισχύει (T)/δεν Βρόγχος bne $s3,$zero,loop0 (taken (T)/not taken (NT) Ισχύει (T)/δεν 1 ΝΤ Τ 1 ΝΤ Τ 2 Τ ΝΤ 2 Τ Τ 3 ΝΤ Τ 3 Τ ΝΤ 4 Τ ΝΤ 5 ΝΤ Τ 6 Τ ΝΤ Ποσοστό επιτυχίας bne $s1,$zero,loop1 = 0% Ποσοστό επιτυχίας bne $s3,$zero,loop0 = 33.3% II. Πίνακας: Βρόγχος bne $s1,$zero,loop1 (taken (Τ)/not taken (NT)) Ισχύει (T)/δεν Βρόγχος bne $s3,$zero,loop0 (taken (T)/not taken (NT) Ισχύει (T)/δεν 1 ΝΤ T 1 ΝΤ Τ 2 ΝΤ T 2 ΝΤ Τ 3 Τ NT 3 Τ ΝΤ 4 T T 5 T T 6 T NT 7 T T 8 T T 9 T NT Ποσοστό επιτυχίας bne $s1,$zero,loop1 = 44.4% (4/9) Ποσοστό επιτυχίας bne $s3,$zero,loop0 = 0% Σελίδα 4 από 7
Άσκηση 6: Μικροεπεξεργαστής ενός κύκλου (15 μονάδες) Η υλοποίηση του lui δεν χρειάζεται αλλαγή στον διάδρομο δεδομένων. Μπορούμε να χρησιμοποιήσουμε την αριθμητική μονάδα για να υλοποιήσουμε την ολίσθηση. Η ολίσθηση είναι σταθερή στα 16 ψηφία προς τα αριστερά. Πρέπει να προσθέσουμε ακόμα μία γραμμή στον πίνακα αληθείας για να καθορίσουμε την ολίσθηση 16 ψηφίων στην αριθμητική μονάδα του επεξεργαστή. Πρέπει να προσέξουμε 2 πράγματα: (1) ότι δεν υπάρχει πεδίο συνάρτησης στην εντολή (functional field in the command), και (2) η διαδικασία ολίσθησης εκτελείται στο πεδίο ακέραιου αριθμού (immediate field), και όχι στην είσοδο του καταχωρητή. Εντολή RegDst ALUSrc Memto Reg Mem Mem Branch Jump ALUOp1 ALUOp2 Reg Write Read Write R (αριθ.) 1 0 0 1 0 0 0 0 1 0 Lw 0 1 1 1 1 0 0 0 0 0 sw X 1 X 0 0 1 0 0 0 0 beq X 0 X 0 0 0 1 0 0 1 J Χ Χ Χ 0 0 0 0 1 Χ Χ lui 1 1 0 1 0 0 0 0 1 1 RegDst = 1: Για να γράψουμε το αποτέλεσμα του ALU πίσω στον τελικό καταχωρητή ($rt) ALUSrc = 1: Φόρτωση πεδίου immediate στο ALU MemtoReg = 0: Πηγή δεδομένων είναι το ALU RegWrite = 1: Γράψε αποτέλεσμα πίσω στο αρχείο καταχωρητών MemRead = 0: δεν χρειάζεται να διαβάσουμε από τη μνήμη δεδομένων MemWrite = 0: δεν χρειάζεται να γράψουμε στη μνήμη δεδομένων Branch = jump = 0: δεν είναι εντολή branch h jump ALUOp 1= ALUOp 2 = 1: προσθέτουμε 11 (που δεν χρησιμοποιείται έως τώρα) για να δηλώσουμε/υλοποιήσουμε την ολίσθηση 16 ψηφίων μέσα στο ALU. Δεν χρειάζονται οποιεσδήποτε αλλαγές στον διάδρομο δεδομένων αφού η ολίς0ηση μπορεί να υλοποιηθεί μέσα στο ΑLU. Σελίδα 5 από 7
Άσκηση 7: Μικροεπεξεργαστής πολλαπλών κύκλων (15 μονάδες) I. Από την κατάσταση 3 μεταπηδούμε στο στάδιο 10 που έχουμε προσθέσει και μετά προχωρούμε στην κατάσταση 5. Κύκλος 1 = αποδικωποίηση εντολής Κύκλος 2 = φόρτωση καταχωρητή $s3 και αναγραφή του στον ενδιάμεσο καταχωρητή Α. Επέκταση πρόσημου για το offset. Κύκλος 3 = πρόσθεση περιεχομένου Α ($s3) και offset, καταγραφή αποτελέσματος διεύθυνσης στον καταχωρητή ALOUut. Το Α περνά από τον πολυπλέκτη (multiplexer) που έχουμε προσθέσει μεταξύ του αρχείου καταχωρητών και ενδιάμεσου καταχωρητή Α. Κύκλος 4 = Διάβασμα περιεχομένων κυρίας μνήμης χρησιμοποιώντας την διεύθυνση που περιέχει το ALUOut και αποθήκευση δεδομένων στον καταχωρητή MDR. Κύκλος 5 = Διάβασμα δεδομένων από τον MDR, από το κάτω μέρος του multiplexer που έχουμε προσθέσει, αποφεύγουμε αναφορά στο αρχείο καταχωρητών όπως θα έκανε μια εντολή load. Κύκλος 6 = Πρόσθεση περιεχομένων καταχωρητών MDR και Β. Κύκλος 7 = Γραφή αποτελέσματος στον καταχωρητή $s1 που βρίσκεται στο αρχείο καταχωρητών. Σελίδα 6 από 7
II. Συνολικά χρειάζονται 7 κύκλοι. Σελίδα 7 από 7