Πίσω

Παράδειγμα

   Το άλλο μας πρόβλημα είναι η πιθανότητα των κινδύνων WAW. Για να δείτε ότι αυτοί υπάρχουν, παρατηρείστε το παράδειγμα του σχήματος 1.8.5. Αν η εντολή LD είχε διευθετηθεί ένα κύκλο νωρίτερα και είχε προορισμό τον F2, τότε θα δημιουργούσε ένα κίνδυνο WAW, καθώς θα έγραφε τον F2 ένα κύκλο νωρίτερα από την ADDD. Οι ενδιάμεσες εντολές δε χρησιμοποιούν τον F2 σαν πηγαίο τελεστέο.
Αν υπήρχε χρήση του F2 ανάμεσα στην ADDD και την FD, η σωλήνωση θα έπρεπε να καθυστερήσει για ένα κίνδυνο RAW, και η LD δεν θα διευθετούνταν μέχρις ότου η ADDD είχε ολοκληρωθεί. Για τη δικιά μας σωλήνωση, μπορούμε να αντικρούσουμε το ότι οι κίνδυνοι WAW συμβαίνουν μόνο όταν εκτελείται μια άχρηστη εντολή, αλλά πρέπει και πάλι να τους εντοπίζουμε και να βεβαιωθούμε ότι το αποτέλεσμα της εντολής LD εμφανίζεται στον F2 όταν τελειώσουμε. Υπάρχουν δύο δυνατοί τρόποι για το χειρισμό αυτού του κινδύνου WAW.

Απάντηση

   Προτεινόμενες λύσεις και παρατηρήσεις για το παραπάνω πρόβλημα

Λύση 1η :
Η πρώτη προσέγγιση είναι να καθυστερήσουμε τη διευθέτηση της εντολής φόρτωσης μέχρις ότου η ADDD να εισέλθει στο στάδιο ΜΕΜ.

Λύση 2η :
Η δεύτερη προσέγγιση είναι να εξαλείψουμε το αποτέλεσμα της εντολής ADDD με τον εντοπισμό του κινδύνου και αλλάζοντας τον έλεγχο ώστε η εντολή ADDD να μη γράψει το αποτέλεσμά της. Τότε, η εντολή LD μπορεί να διευθετηθεί αμέσως.

Παρατηρήσεις:
Επειδή ο κίνδυνος είναι σπάνιος, κάθε μία από τις παραπάνω λύσεις θα δουλεύει άψογα — μπορείτε να διαλέξετε όποιο είναι ευκολότερο να υλοποιηθεί. Σε κάθε περίπτωση, ο κίνδυνος μπορεί να εντοπιστεί κατά τη διάρκεια του σταδίου ID όταν η εντολή LD διευθετείται. Τότε η καθυστέρηση της LD ή εξάλειψη του αποτελέσματος της εντολής ADDD είναι εύκολη. Η δύσκολη κατάσταση είναι να εντοπίσουμε ότι η εντολή LD μπορεί να τελειώσει πριν την εντολή ADDD, καθώς αυτό απαιτεί τη γνώση του μήκους της σωλήνωσης και της τρέχουσας θέσης της εντολής ADDD. Ευτυχώς, αυτή η ακολουθία κώδικα (δύο εγγραφές χωρίς ενδιάμεσο διάβασμα) θα είναι πολύ σπάνια, οπότε μπορούμε να χρησιμοποιήσουμε μια απλή λύση.

Λύση 3η :
Αν μια εντολή στο στάδιο ID θέλει να γράψει στον ίδιο καταχωρητή με μια εντολή που διευθετήθηκε νωρίτερα, μην διευθετείς την εντολή στο στάδιο ΕΧ.