ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y» Σάββατο, 31 Οκτωβρίου 2015 ΔΙΑΡΚΕΙΑ ΔΙΑΓΩΝΙΣΜΑΤΟΣ 150 ΛΕΠΤΑ ΘΕΜΑ 1. Κώδικας MIPS assembly (10+10+10+10 = 40 μονάδες) H συνάρτηση func που ορίζουμε παρακάτω είναι γραμμένη σε assembly του επεξεργαστή MIPS. H άσκηση σας ζητάει τα εξής: a. Γράψτε τον αντίστοιχο κώδικα σε C. Ο κώδικάς σας θα πρέπει να συμπεριλαμβάνει και τον ορισμό της συνάρτησης func, δηλ. τον header και τις παραμέτρους με τους τύπους των παραμέτρων. Για να πάρετε όλους τους βαθμούς του ερωτήματος, ο κώδικάς σας θα πρέπει να χρησιμοποιεί δομές της C και όχι να είναι μια απλή 1-1 μετάφραση των εντολών της assembly σε C. Απαγορεύεται επίσης η χρήση στον κώδικά σας της εντολής goto. b. Περιγράψτε με μια πρόταση τι ακριβώς κάνει αυτός ο παρακάτω κώδικας. Συγκεκριμένα, ποια είναι η τιμή θα επιστραφεί στον καταχωρητή $v0; Η μόνη απάντηση που θα γίνει δεκτή θα πρέπει να βρίσκεται μέσα στο κουτί. c. Υποθέστε ότι οι εντολές load και οι εντολές store χρειάζονται 2 κύκλους μηχανής, οι αριθμητικές εντολές και οι εντολές jump, jr, jal 1 κύκλο μηχανής, ενώ οι εντολές διακλάδωσης χρειάζονται 1 κύκλο εάν δεν κάνουν άλμα και 2 κύκλους εάν κάνουν άλμα. Για αρχική τιμή του καταχωρητή $a2 = (2*k + αρχική τιμή του $a1) να υπολογίσετε το χρόνο εκτέλεσης της συνάρτησης func σε κύκλους μηχανής. Θεωρείστε ότι k 0. d. Ποιο το μέσο CPI για όλο το πρόγραμμα; func: Exit: bge $a1, $a2, Exit sll $t1, $a1, 2 add $t1, $a0, $t1 sll $t2, $a2, 2 add $t2, $a0, $t2 lw $t3, 0($t1) lw $t4, 0($t2) sw $t3, 0($t2) sw $t4, 0($t1) addi $a1, $a1, 1 addi $a2, $a2, -1 j func jr $ra
Λύση a. void func (int *array, int A1, int A2) { int temp; while (A1 < A2) { temp = array[a1]; /* swap array[a1] and array[a2] */ array[a1] = array[a2]; array[a2]= temp; A1++; A2--; } } b) H func αντιστρέφει τα στοιχεία του πίνακα array από το $a1 μέχρι και το $a2. c) func: Exit: bge $a1, $a2, Exit 3T/2NT* sll $t1, $a1, 2 1 add $t1, $a0, $t1 1 sll $t2, $a2, 2 1 add $t2, $a0, $t2 1 lw $t3, 0($t1) 2 lw $t4, 0($t2) 2 sw $t3, 0($t2) 2 sw $t4, 0($t1) 2 addi $a1, $a1, 1 1 addi $a2, $a2, -1 1 j func 1 jr $ra 1 Η συνάρτηση εκτελεί ένα loop με κόστος 17, ενώ όταν ισχύει η συνθήκη τερματισμού εκτελείται το σκιαγραφημένο τμήμα με κόστος 4. Για είσοδο Α1, Α2 το κόστος είναι ceiling((α2-α1) / 2)*17 +4. Για Α2 - Α1 = 2*k προκύπτει : Χρόνος Εκτέλεσης = k*17 +4 κύκλοι μηχανής. *bge pseudo-instruction (full credit for cost 2T / 1NT) d) Το κόστος είναι k*17 +4 κύκλοι μηχανής. Εκτελούνται ceiling((α2-α1) / 2)*12 +2 = ((2k)/2)*12 + 2 = 12k + 2 εντολές. Άρα CPI average = 17κ+4 12k+2 ΘΕΜΑ 2. Αριθμητική Υπολογιστών (13+12=25 μονάδες)
a. Μπορεί κάθε ακέραιος αριθμός 32-bit να αναπαρασταθεί από έναν float στο IEEE standard 754 χωρίς απώλεια ακρίβειας; Εάν πιστεύετε πως ναι, θα πρέπει να το δείξετε με κάποιο λογικό επιχείρημα. Εάν πιστεύετε πως όχι, θα πρέπει να δώσετε ένα αντιπαράδειγμα. Η απάντηση είναι όχι. Για παράδειγμα, ο ακέραιος αριθμός 2 30 + 1 δεν μπορεί να αναπαρασταθεί χωρίς λάθος από έναν αριθμό απλής ακρίβειας. b. Έστω οι παρακάτω αριθμοί κινητής υποδιαστολής απλής ακρίβειας σύμφωνα με το IEEE standard 754: float X1 = 1,10 * 2 45 float X2 = 1,01 * 2 25 float X3 = 100 float X4 = 1,0 * 2 60 Με ποια σειρά θα πρέπει να υπολογισθεί το άθροισμα των αριθμών αυτών για να πετύχουμε την μεγαλύτερη δυνατή ακρίβεια (ή αντίστοιχα να έχουμε το μικρότερο δυνατόν λάθος); H καλύτερη σειρά είναι να προσθέσουμε τους αριθμούς με αύξουσα σειρά: (((X3+X2) + X1) + X4). Με αυτόν τον τρόπο, οι αριθμοί που προσθέτουμε κάθε φορά θα είναι όσο το δυνατόν πιο κοντά μεταξύ τους και ο μικρότερος από αυτούς θα συνεισφέρει στην πρόσθεση. Για παράδειγμα, θα ήταν εντελώς άστοχο να προσθέταμε το X3 και το X4 αμέσως, γιατί η συνεισφορά του Χ3 θα χανόταν. ΘΕΜΑ 3 (13+12+10 = 35 μονάδες) Ένα δυαδικό δέντρο είναι μία δομή δεδομένων που αποτελείται από ένα σύνολο κόμβων που συνδέονται από ακμές. Ορίζεται αναδρομικά ως εξής: Ένα δυαδικό δένδρο είναι είτε κενό είτε αποτελείται από μια ρίζα (root), δηλαδή ένα κόμβο στον οποίο δεν καταλήγουν αλλά μόνο ξεκινούν ακμές, και μέχρι 2 υποδέντρα Τ 1, Τ 2 το καθένα ξεχωριστό από τα άλλα και από τη ρίζα. Υπάρχει μια ακμή από τη ρίζα στις ρίζες των Τ 1, Τ 2.
Ο βαθμός (degree) ενός κόμβου είναι ο αριθμός των παιδιών του και είναι 0, 1, ή 2. H άσκηση σας ζητάει να απαντήσετε στα παρακάτω ερωτήματα: A B F C E G D a. Να γράψετε την αναδρομική συνάρτηση count_nodes που υπολογίζει τον αριθμό των κόμβων ενός δυαδικού δέντρου: count _ nodes( root 0, if R NULL * R) 1 count _ nodes( R left ) count _ nodes( R right), if R NULL b. Υποθέστε ότι υλοποιούμε την συνάρτηση count_nodes σε MIPS assembly χρησιμοποιώντας αναδρομή. Ποιοί είναι οι καταχωρητές που θα πρέπει οπωσδήποτε να σώζονται στην στοίβα σε κάθε κλήση της συνάρτησης count_nodes; Ζητάμε τους ελάχιστους καταχωρητές που θα πρέπει να σώζονται ώστε η αναδρομή να εκτελεσθεί σωστά. Οι καταχωρητές $a0 και $ra πρέπει να σώζονται οπωσδήποτε στην στοίβα σε κάθε κλήση της συνάρτησης count_nodes. Ο καταχωρητής $a0 θα περιέχει το όρισμα εισόδου R->right και το όρισμα εισόδου R->left. Δεν χρειάζεται επιπλέον καταχωρητής $a1. c. Ποιό είναι το μέγιστο μέγεθος της στοίβας σε bytes που απαιτείται για την εκτέλεση της αναδρομής count_nodes(root *R) στην γενική περίπτωση ενός δυαδικού δέντρου. Να βρεθεί το μέγιστο μέγεθος της στοίβας για το συγκεκριμένο δέντρο που σας δίδεται στην εικόνα. Μέγιστο μέγεθος στοίβας = Υψος του δένδρου * #Αριθμός καταχωρητών * 4(bytes). To ύψος του δένδρου ορίζεται ως το πιο μακρύ μονοπάτι από την ρίζα σε κάποιο φύλλο του δένδρου.
Στο συγκεκριμένο παράδειγμα το μέγιστο μέγεθος στοίβας είναι 2*4*4 = 32 bytes.