ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών (ΗΜΜΥ) HMΜY 212 Οργάνωση Η/Υ και Μικροεπεξεργαστές Εαρινό Εξάμηνο, 2007 1 η Ενδιάμεση Εξέταση Απαντήσεις/Λύσεις Άσκηση 1: Σωστό/Λάθος (10 μονάδες) Ερώτηση 1 2 3 4 5 6 7 8 9 10 Απάντηση Λ Λ Λ Σ Λ Λ Λ Λ Λ Σ Άσκηση 2: Κυκλώστε την σωστή απάντηση (10 μονάδες) Ερώτηση 1 2 3 4 5 Απάντηση β α γ γ δ Άσκηση 3: Αριθμητική Κινητής Υποδιαστολής (15 μονάδες) Ι. -115.875 dec = -1110011.111 bin Κανονικοποίηση αριθμού = 1.110011111 2 6 Πρόσημο = 1 Πολωμένος εκθέτης = 127 dec + 6 dec = 133 dec = 10000101 bin Κλάσμα = 110011111 Σε μορφή IEEE 754: 1 (πρόσημο 1 bit) 10000101 (εκθέτης 8 bits) κλάσμα (23 bits) 11001111100000000000000 Τελικός αριθμός: 1100 0010 1110 0111 1100 0000 0000 0000 bin Σε δεκαεξαδική μορφή: C2E7C000 hex ΙΙ Σε δυαδική μορφή: 01000000100100000000000000000000bin Πρόσημο: 0 (θετικό) Εκθέτης: 100000001 bin = 129, μείον η πόλωση = 129 dec 127 dec = 2 dec Κλάσμα = 1 + 0.00100000000000000000000bin = 1.001 Τελικός αριθμός = +1.001 2 2 = 100.1 bin = +4.5 dec Σελίδα 1 από 6
ΙΙΙ 1. (Ι.) α = χ ψ Σημείωση: δεν εφαρμόζουμε στρογγυλοποίηση στον αριθμό γιατί δεν υπάρχει περιορισμός στον αριθμό ψηφίων (bits) στην αναπαράσταση του κλασματικού αριθμού. Προχωρούμε αμέσως με πολλαπλασιασμό: 1.110 bin 1.001 bin = 01.11 1110 bin Προσθέτουμε τους εκθέτες: 0 + 5 = 5 Τελικό αποτέλεσμα, α: 1.11111 bin 2 5 = 111111.0 bin = 63 dec 2. (ΙΙ.) β = ψ + ζ Σημείωση: δεν εφαρμόζουμε στρογγυλοποίηση στον αριθμό γιατί δεν υπάρχει περιορισμός στον αριθμό ψηφίων (bits) στην αναπαράσταση του κλασματικού αριθμού. Αρχικά πρέπει να ολισθήσουμε τους δύο εκθέτες έτσι που να τους φέρουμε στην ίδια δύναμη. Το ζ έχει μικρότερο εκθέτη έτσι εφαρμόζουμε ολίσθηση 1 φορά στα δεξιά: 0.1111 2 5 Προσθέτουμε τους 2 αριθμούς: 1.001 bin + 0.1111 bin = 10.0001 bin Κανονικοποιούμε τους αριθμούς: 1.00001 2 1 Προσθέτουμε τους εκθέτες: 1 + 5 = 6 Αύξηση του εκθέτη κατά 5. Τελικός αριθμός, β: 1.00001 bin 2 6 = 1000010 = 66 dec Άσκηση 4: Αριθμητική (10 μονάδες) -2 n-1 μέχρι + 2 n-1-1 beta [-8,+7] + 1101-3 ------------- Υπερχείλιση! -8 1000-7 1001-6 1010 ΙΙΙ. $s2 div $s3 στον καταχωρητή Hi $s2 mod $s3 στον καταχωρητή Lo Σελίδα 2 από 6
Άσκηση 5: Εκτίμηση Απόδοσης (10 μονάδες) Ι. Θεωρούμε 100 εντολές. Από αυτές 30 loads/stores περιλαμβάνονται στον μη βελτιστοποιημένο υπολογιστή και 20 loads/stores περιλαμβάνονται στον βελτιστοποιημένο υπολογιστή. Αρχικός χρόνος εκτέλεσης: 100 εντολές 1 (CPI) C (περίοδος ρολογιού) = 100C. Νέος χρόνος εκτέλεσης: 90 εντολές 1 (CPI) 1.05C (περίοδος ρολογιού) = 94.5C. Έτσι με τον νέο τρόπο έχουμε αύξηση της απόδοσης κατά 5.5% περίπου. Άρα ο νέος βελτιστοποιημένος υπολογιστής είναι γρηγορότερος. ΙΙ. Χρόνος εκτέλεσης μετά τη βελτίωση = ανεπηρέαστος χρόνος εκτέλεσης + (επηρεαζόμενος χρόνος εκτέλεσης / ποσοστό βελτίωσης) Άσκηση 6: Απόδοση (10 μονάδες) Time = (seconds/cycle) (cycles/instruction) (number of instructions) Τότε ο αναμενόμενος χρόνος εκτέλεσης είναι (1 second/5 10 9 ) (0.8 cycles/instruction) (7.5 10 9 instructions) = 1.2 seconds. O XYZ καταλαμβάνει 1.2/3 seconds, ή 40% του συνολικού χρόνου εκτέλεσης. I Το πρόγραμμα Prog που τρέχει στον Η/Υ Mech χρειάζεται (10 9 cycles/second) 10 seconds = 10 10 cycles. Το Prog_optimized παίρνει (10 9 cycles/second) 9 seconds = 9 10 cycles. Αυτό αφήνει 10 9 κύκλους για το βελτιστοποιημένο πρόγραμμα. Τώρα, κάθε φορά που αντικαθιστούμε ένα πολλαπλασιασμό με 2 προσθέσεις παίρνει 4 2 1 λιγότερους κύκλους για κάθε αντικατάσταση. Τότε θα έπρεπε να υπήρξαν 10 9 κύκλοι /(2 κύκλοι ανά αντικατάσταση) = 5 10 8 αντικαταστάσεις πολλαπλασιασμών για να μετατρέψουμε το Prog σε Prog_optimized. Άσκηση 7: Assembly για MIPS, Σύντομες Eρωτήσεις (10 μονάδες) Μια συνάρτηση που δεν καλεί άλλη συνάρτηση, η μια φωλιασμένη συνάρτηση (leaf procedure) δηλαδή που δεν έχει αναδρομή προτιμά τους καταχωρητές τύπου $t αντί του τύπου $t γιατί δεν είναι ανάγκη να τους σώσει στη στοίβα. Τοποθετεί το εκτελέσιμο πρόγραμμα (machine code με απόλυτες διευθύνσεις) στην κυρίως μνήμη σε χώρο που να μπορεί να κρατήσει ολόκληρο το πρόγραμμα, αρχικοποιεί τους καταχωτηρές και τη στοίβα, έτσι που να αρχίσει η σωστή εκτέλεση του προγράμματος. Σελίδα 3 από 6
I Το πεδίο immediate περιέχει ένα 16-bit αριθμό ο οποίος αντιπροσωπεύει τα 16 λιγότερα σημαντικά δυαδικά ψηφία (least significant bits) μιας διεύθυνσης προς τη κύρια μνήμη της MIPS. Στην περίπτωση beq εάν η εντολή ισχύει τότε εφαρμόζεται προέκταση του πρόσημου σε αυτόν τον αριθμό για να γίνει 32 bits ο οποίος μετά προσθέτεται με τα περιεχόμενα του μετρητή προγράμματος + 4 (PC) για να μεταπηδήσει το πρόγραμμα σε μια νέα διεύθυνση ίση με PC + 4 + immediate 4. IV. sll $s1 $s1 4 srl $s1 $s1 16 Άσκηση 8: Assembly για MIPS (15 μονάδες) addu $t5, $zero, $t0 # O $t5 δείχνει στην αρχή του next[0..3] addu $s5, $zero, $s0 # O $s5 δείχνει στην αρχή του value[0..3] addiu $t1, $zero, 1 # Ο $t1 ισούται με ένα loop: sw $t1, 0($s5) # Σώσε τον $t1 στον πίνακα value[0..3] addiu $t1, $t1, 1 # Αύξησε τον $t1 κατά ένα lw $t2, 0($t5) # Φόρτωσε $t2 με αριθμό από next[0..3] beq $t2, $zero, endloop # Να βγεις έξω από τον βρόχο; sll $t2, $t2, 2 # Ολίσθησε $t2 κατά 2 ψηφία αριστερά addu $t5, $t0, $t2 # Άλλαξε διεύθυνση που περιέχει $t5 addu $s5, $s0, $t2 # Άλλαξε διεύθυνση που περιέχει $a5 j loop # Επανάληψη βρόχου endloop: Μερικά σχόλια πιο πάνω. Η λύση στο ΙΙ πιο κάτω δείχνει πως το πρόγραμμα αντιγράφει από τον πίνακα next[3..0] στον πίνακα value[3..0] αναλόγως στην κάθε επανάληψη του βρόχου.. Αρχικά πριν από τον βρόχο: $t5 = $t0 περιέχουν τον δείκτη προς αρχή του πίνακα next[3..0] $s5 = $s0 περιέχουν τον δείκτη προς αρχή του πίνακα value[3..0] $t1 = 1 Loop1 Αποθήκευση $t1=1 στο value[3..0]+0 $t1 = 2 $t2 = 2 $t2 = 8 Σελίδα 4 από 6
$t5 = $t0 + 8 δείκτης προς επόμενες 2 διευθύνσεις πίνακα next[3..0] με βάση την αρχή του $s5 = $s0 + 8 δείκτης προς επόμενες 2 διευθύνσεις πίνακα value[3..0] με βάση την αρχή του Loop2 Αποθήκευση $t1=2 στο value[3..0]+8 $t1 = 3 $t2 = 3 $t2 = 12 $t5 = $t0 + 12 δείκτης προς επόμενες 3 διευθύνσεις πίνακα next[3..0] με βάση την αρχή του $s5 = $s0 + 12 δείκτης προς επόμενες 3 διευθύνσεις πίνακα value[3..0] με βάση την αρχή του Loop3 Αποθήκευση $t1=3 στο value[3..0]+12 $t1 = 4 $t2 = 1 $t2 = 4 $t5 = $t0 + 4 δείκτης προς επόμενη 1 διεύθυνση πίνακα next[3..0] με βάση την αρχή του $s5 = $s0 + 4 δείκτης προς επόμενη 1 διεύθυνση πίνακα value[3..0] με βάση την αρχή του Loop4 Αποθήκευση $t1=4 στο value[3..0]+4 $t1 = 0 beq $t2, $0, endloop = true, βγες από τον βρόχο στο endloop Τελικό περιεχόμενο πίνακα value[3..0] = 1, 4, 2, 3 Άσκηση 9: Assembly για MIPS (15 μονάδες) Ετικέτα (label) Εντολή (Instruction) Σχόλιο (Comment) addi $s4, $s0, 5 slt $s5, $s4, $s1 Is 5 < a? bne $s5, $0, Else If so, branch to Else sub $s6, $s3, $s1 $s6: c-a addi $s2, $s6, -25 b = c-a-25 j Continue Skip next instruction Else: mult $s1, $s4 c = a * 5 Continue: add $s1, $s2, $s3 a = b + c Σελίδα 5 από 6
Άσκηση 10: Προγραμματισμός σε MIPS (5 + 5 bonus μονάδες) Στην αρχή 2 add. O πρώτος κύκλος 100 φορές από την L0 μέχρι την $s1,$zero,l1, σύνολο εντολών 100 * 6 = 600. Μετά από addi $s1,$s0,200 μέχρι bne $s3,$zero,l0 μία φορά, σύνολο 4 εντολές. Μετά πάμε στην L0, εκτελείται 100 * 127 φορές, σύνολο 12700*6 = 76,200 εντολές. Από addi $s1,$s0,200 μέχρι bne $s3,$zero,l0 μία 127 φορές, σύνολο 4*127 = 508 εντολές. Σύνολο εντολών: 2 + 600 + 4 + 76,200 + 508 = 77,310 Βρείτε τις συχνότητες εκτέλεσης (%) των ακόλουθων τύπων εντολών (Bonus 5 μονάδες): R-type (περιλαμβάνει την subi):2 + 3 * 100 + 12700 * 3 + 2 + 127 * 2 = 38656 50% Lw: 100 * 1 + 100 * 127 * 1 = 12800 16.56% Sw: 100 * 1 + 127 * 1 + 127 * 100 * 1 = 12926 16.72% Branch: 100 + 1 + 127 * 100 + 127 = 12928 16.72% Τέλος Σελίδα 6 από 6