Έχω μια ερώτηση σχετικά με το effective address calculation. Έστω ο παρακάτω κώδικας (της άσκησης)
S.D F10 8 R1 DADDI R1 R1 #16
Η store θα κάνει το effective address calculation (memory[R1+8]) κατά το EX στάδιό της σύμφωνα με την εκφώνηση. Έστω τώρα ότι η store περιμένει όρισμα (F10), οπότε δεν μπορεί να αρχίσει να εκτελείται. Επίσης, έστω ότι δεν υπάρχει εξάρτηση στον R1.
Η add δεν μπορεί να αρχίσει να εκτελείται, γιατί αν τελειώσει (WB) πριν τη store, η store θα αποτύχει στο σωστό calculation του effective address (R1+8). Σωστά ως εδώ;
Όμως, στις περσινές λύσεις της άσκησης tomasulo (πρώτο μέρος, χωρίς ROB), αυτό δε γίνεται. Στον κύκλο 10, η DADDUI γράφει αποτελέσμα στον R2, ενώ η store που είναι πριν από αυτήν εκτελείται (EX) στον κύκλο 27. Αν σε εκείνον τον κύκλο γίνει το effective address calculation (για το lea της store), η σημασιολογία του προγράμματος δεν είναι ορθή. Από ότι καταλαβαίνω, το effective address calculation (ο υπολογισμός R2+0 για αυτήν τη store) έγινε κατά το IS. Έτσι δε δημιουργείται πρόβλημα με εντολές που ακολουθούν και πειράζουν την τιμή του R2. Κατάλαβα λάθος;
Ζητώ προκαταβολικά συγγνώμη για την παιδαριώδη ερώτηση. Ευχαριστώ για τυχόν διευκρίνηση
Geoffrey Tolwyn wrote:
Έχω μια ερώτηση σχετικά με το effective address calculation. Έστω ο παρακάτω κώδικας (της άσκησης)
S.D F10 8 R1 DADDI R1 R1 #16Η store θα κάνει το effective address calculation (memory[R1+8]) κατά το EX στάδιό της σύμφωνα με την εκφώνηση. Έστω τώρα ότι η store περιμένει όρισμα (F10), οπότε δεν μπορεί να αρχίσει να εκτελείται. Επίσης, έστω ότι δεν υπάρχει εξάρτηση στον R1.
Η add δεν μπορεί να αρχίσει να εκτελείται, γιατί αν τελειώσει (WB) πριν τη store, η store θα αποτύχει στο σωστό calculation του effective address (R1+8). Σωστά ως εδώ;
Η store, τη στιγμή που γίνεται issue, διαβάζει τη σωστή τιμή του R1 (με την υπόθεση ότι είναι διαθέσιμος - αν δεν είναι διαθέσιμος, καταγράφει τον rs που θα τον παράξει). Οπότε, ακόμα και αν δεν αρχίσει να εκτελείται επειδή περιμένει τον F10, θα έχει διαβάσει σωστά όλη την απαραίτητη πληροφορία για την αποθήκευσή του αργότερα στη μνήμη. Διότι δε θα διαβάσει τον R1 από το register file (όπου όντως θα υπήρχε κίνδυνος για αλλαγή στη σημασιολογία), αλλά από το πεδίο V που θα τον έχει αποθηκεύσει κατά το issue (αν ήταν διαθέσιμος), ή μέσω του cdb από την εντολή η οποία θα τον παράξει. Πρόκειται δηλαδή στην ουσία για register renaming πάνω στον R1, το οποίο επιλύει το WAR hazard που υφίσταται ανάμεσα στις 2 εντολές.
Ν.
advcomparch@lists.cslab.ece.ntua.gr