ÊáëçóðÝñá,
Ðáñüëï ðïõ Ý÷åôå Þäç áðáíôÞóåé óå åñþôçóç ðïõ óáò Ýêáíá ó÷åôéêÜ ìå ôï ðüôå èåùñïýìå üôé åëåõèåñþíïíôáé ôá repositories, ìå ìðÝñäåøå ç áðÜíôçóç ðïõ áöïñïýóå ôï ROB (áí ç ðñþôç åíôïëÞ óôçí ïõñÜ êÜíåé commit ôç ÷ñïíéêÞ óôéãìÞ k ôüôå ç åðüìåíç åíôïëÞ êÜíåé issue ôç ÷ñïíéêÞ óôéãìÞ k+1).
Ìå Üëëá ëüãéá, áí ôç ÷ñïíéêÞ óôéãìÞ k ìéá åíôïëÞ êÜíåé WB êáé åëåõèåñùèåß Ýíá entry åíüò repository ðïõ åßíáé ãåìÜôï (ð.÷. Ýíá áðü ôá äýï entries ôïõ FP multiplier), ìéá åíôïëÞ ðïõ ãéá íá êÜíåé issue ÷ñåéÜæåôáé áõôü ôï entry èá êÜíåé issue óôïí ßäéï êýêëï (k) Þ óôïí k+1?
Åõ÷áñéóôþ.
Αν κατάλαβα καλά το σενάριο στο οποίο αναφέρεσαι είναι το εξής: Έστω δύο εντολές i και j που χρησιμοποιούν την ίδια μονάδα εκτέλεσης (και συνεπώς το ίδιο RS). Η i είναι προγενέστερη στην σειρά προγράμματος, εκτελείται ήδη, ενώ η j λόγω μη διαθέσιμου entry στo RS έχει stall-άρει και περιμένει να γίνει issue.
Στον κύκλο k-1 ολοκληρώνεται η εκτέλεση της i (μέχρι και τότε η i κατέχει κάποιο entry του RS, και η j περιμένει). Στον κύκλο k η i κάνει WB. Στον ίδιο κύκλο απελευθερώνει το entry της στον RS, όμως η j δε γίνεται ακόμα issue. Η j θα γίνει issue και θα καταλάβει το entry στον RS στον κύκλο k+1.
Ένα τέτοιο σενάριο εμφανίζεται στο 2ο παράδειγμα που υπάρχει στις διαφάνειες, στους κύκλους 14,15,16 με τις εντολές Mult.
Ν.
Periklis Vasileiou wrote:
Καλησπέρα,
Παρόλο που έχετε ήδη απαντήσει σε ερώτηση που σας έκανα σχετικά με το πότε θεωρούμε ότι ελευθερώνονται τα repositories, με μπέρδεψε η απάντηση που αφορούσε το ROB (αν η πρώτη εντολή στην ουρά κάνει commit τη χρονική στιγμή k τότε η επόμενη εντολή κάνει issue τη χρονική στιγμή k+1).
Με άλλα λόγια, αν τη χρονική στιγμή k μια εντολή κάνει WB και ελευθερωθεί ένα entry ενός repository που είναι γεμάτο (π.χ. ένα από τα δύο entries του FP multiplier), μια εντολή που για να κάνει issue χρειάζεται αυτό το entry θα κάνει issue στον ίδιο κύκλο (k) ή στον k+1?
Ευχαριστώ.
Advcomparch mailing list Advcomparch@lists.cslab.ece.ntua.gr http://lists.cslab.ece.ntua.gr/mailman/listinfo/advcomparch
Tο ίδιο ισχύει και στους load/store buffers (ανεξαρτήτως ύπαρξης ROB) ;
Δηλαδή αν στον κύκλο k κάνει WR μια εντολή LD στο ίδιο κύκλο μπορεί να γίνει issue μία άλλη εντολή LD με διαφορετικά ορίσματα ; 'Η το issue της δεύτερης LD θα πρέπει να γίνει στον κύκλο k+1 δεδομένου οτι έχουμε 1 port για την μνήμη.
Ναι, το ίδιο ισχύει και για τους load/store buffers. Στον κύκλο k όπως λες η LD κάνει WB, και την ίδια στιγμή θέτει στο entry του load buffer όπου βρισκόταν, RS[r].Busy = no. Αυτή η πληροφορία, ότι δηλ. απελευθερώθηκε entry στον load buffer, θα χρησιμοποιηθεί από τη δεύτερη LD στον επόμενο κύκλο για να γίνει issue. Αυτός είναι ο λόγος που δε γίνεται issue στον κύκλο k και η δεύτερη LD, και όχι ότι έχουμε 1 port για τη μνήμη (conflict στο memory port εξάλλου θα είχαμε, όπως λέει η εκφώνηση, αν τύχαινε και οι δύο LD να βρίσκονται στο στάδιο ΕΧ στον ίδιο κύκλο -- στο στάδιο WB η LD δε χρησιμοποιεί τη μνήμη, οπότε δε θα 'χες πρόβλημα ακόμα κι αν η 2η LD μπορούσε στον ίδιο κύκλο να 'χε αρχίσει την εκτέλεσή της).
Ν.
Nick none wrote:
Tο ίδιο ισχύει και στους load/store buffers (ανεξαρτήτως ύπαρξης ROB) ;
Δηλαδή αν στον κύκλο k κάνει WR μια εντολή LD στο ίδιο κύκλο μπορεί να γίνει issue μία άλλη εντολή LD με διαφορετικά ορίσματα ; 'Η το issue της δεύτερης LD θα πρέπει να γίνει στον κύκλο k+1 δεδομένου οτι έχουμε 1 port για την μνήμη.
advcomparch@lists.cslab.ece.ntua.gr