Γράψτε πρόγραμμα assembly MIPS για εκτέλεση στον προσομοιωτή EduMips64 και τον προσομοιωτή κρυφών μνημών DineroIV, το οποίο να εκτελεί τον παρακάτω απλό υπολογισμό: Εκτελεί την πράξη X=X+YZ, όπου X[i][j], Υ[i][j], Ζ[i][j] τυχαίοι τετραγωνικοί πίνακες (8 byte κάθε ακέραιος – oι Χ, Υ, Ζ αποθηκεύονται στο τμήμα δεδομένων του προγράμματος από την αρχή) με διαστάσεις 50x50 (δηλαδή i, j=0, 1, ..., 49) και αφού ολοκληρώσει την πράξη X=X+YZ, υπολογίζει τον αριθμό των αρνητικών (n), μηδενικών (z) και θετικών (p) αριθμών. Στο τέλος εκτυπώνει τα τρία αυτά αποτελέσματα σε μία γραμμή. Ο χρόνος εκτέλεσης της εκτύπωσης του αποτελέσματος θα συνυπολογίζεται στο συνολικό χρόνο εκτέλεσης του προγράμματός σας.
Οι πίνακες που χρησιμοιποήθηκαν περιέχουν τυχαίους αριθμούς απο το -127 μεχρι το 127. Η ανολογία αρνιτικών με θετικών αριθμων έχει καθοριστεί με τυχαιότητα 50% αρνιτικοι 50% θετικοί. Στην αρχή του κωδικά έχουμε ορίσει τις αναλογες μεταβλητές που ζητάτα η άσκηση στους αντιστιχους καταχωρητές ως εξής :
Ο R2 αντιστιχεί στο i
Ο R3 αντιστιχεί στο j
Ο R4 αντιστιχεί στο k
Ο R7 αντιστιχεί στο X[i,j]
Ο R9 αντιστιχεί στο Z[i,j]
Ο R11 αντιστιχεί στο Y[i,j]
Ο R5 αντιστιχεί στην μεγιστη διάσταση του πινακα (50)
Ο R14 αντιστιχεί το πλήθος των μηδενικών
Ο R15 αντιστιχεί το πλήθος των θετικών
Ο R16 αντιστιχεί το πλήθος των αρνητικών Για τον υπολογισμού του στοιχείου x[i,j] χρησιομοποιήτε μια τριπλή εμφολευμένη επανάληψη η οποία έχει την εξή δομη for j=1 μεχρι 50 1 for k=1 μεχρι 50 2 for i=1 μεχρι 50 3 end end end Η επανάληψη αυτή μας βοηθάει να υπολογίσουμε το γινόμενο των πινάκων Υ[i][j] * Ζ[i][j] Στον 2ο βρογχο καθε φορά φορτώνουμε την τιμή του X[i,j] και αρχικοποιπούμε το offset στην αρχή της κάθε γραμμής και της κάθε στηλής οπου θα γίνει ο πολλαπλασιαμός. Στον 3ο βρόγχο γίνεται ο πολλαπλασιασμός του στοιχείου Z[k,j] * Y[i,k] όπου το αποτέλεσμα φορτώνετε στον καταχωρητή low και από εκεί το βάζουμε στον καταχωριτή r12.Στην συνέχεια γίνετε η πρόσθεση με το X[i,j] και το αποτέλεσμα και το αποτέλεσμα φυλάσσετε στον καταχωρητή R7.Μετά το τέλος της επανάληψης η τιμή του R& ελέγχετε αν είναι μηδενική ,θετική ή αρνητική. Στην αρχή θεωρήσαμε ότι οι θετικοί αριθμοί είναι 2500 και στην συνέχεια μετά από κάθε έλεγχο που γίνετε στον καταχωρητή R7 αν ο αριθμός είναι αρνητικός ή μηδενικό τότε το πλήθος τον θετικών μειώνετε και αυξάνετε ο ανάλογος μετρητής. Μετά το τέλος των επαναλήψεων το πρόγραμμα τυπώνει το πλήθος των θετικών, των αρνητικών και τα μηδενικά που παρουσιαστήκαν.
Οι επιλογές σχεδίασης με βάση τις οποίες βρήκαμε τον καλύτερο συνδυασμο μεταξύ αποδοσης και υλικου είναι η ενιαία μνημη Cache L1 με μεγεθος 16Κ bytes, μεγεθος μπλοκ 4, 2-way associativity και μεγεθος μπλοκ L2 16. Έτσι το συνολικό CPI = [((1762365)+(358060)+1283918)/1157657]*[(1000/900)+(2%)], όπου 176236 είναι τα L1 misses και 3580 είναι τα misses του L2.