Νόμιζα ότι το είχα ήδη καταλάβει, αλλά τώρα που κοίταξα τις περσινές λύσεις μπερδεύτικα εντελώς. Το ότι το βάθος του pipeline είναι 5 σημαίνει ότι αν σε κάποιο κύκλο υπάρχουν 5 εντολές που βρίσκονται ακόμα σε εξέλιξη (δεν έχουν κάνει ακόμα WB) δεν μπορώ να κάνω fetch νέες εντολές;
Μπορείς να κάνεις fetch (και decode) νέες εντολές όσο μπορείς να κάνεις issue, που σημαίνει, όσο υπάρχουν διαθέσιμοι rs για να υποδεχθούν νέες εντολές που στέλνονται σε αυτούς με τη σειρά του προγράμματος. Αν δεν υπάρχει διαθέσιμος rs για να δρομολογηθεί κάποια εντολή, τότε αυτή θα πρέπει να περιμένει, μπλοκάροντας όλα τα προηγούμενα στάδια (in-order). Το βάθος του pipeline σε αυτήν την αρχιτεκτονική δεν καθορίζει πόσες εντολές θα βρίσκονται σε εξέλιξη.
Ν.
Yiannis Kokkinis wrote:
Νόμιζα ότι το είχα ήδη καταλάβει, αλλά τώρα που κοίταξα τις περσινές λύσεις μπερδεύτικα εντελώς. Το ότι το βάθος του pipeline είναι 5 σημαίνει ότι αν σε κάποιο κύκλο υπάρχουν 5 εντολές που βρίσκονται ακόμα σε εξέλιξη (δεν έχουν κάνει ακόμα WB) δεν μπορώ να κάνω fetch νέες εντολές;
Advcomparch mailing list Advcomparch@lists.cslab.ece.ntua.gr http://lists.cslab.ece.ntua.gr/mailman/listinfo/advcomparch
Έστω οι ακόλουθες εκτελέσεις εντολών (από την άσκηση).
DADDI R1,R1,#16 BNEZ R1,foo ;Η διακλάδωση έχει προβλεφθεί TAKEN L.D F2,0(R1)
Αν δεν κάνω λάθος, τη στιγμή που που η DADDI είναι σε στάδιο WB γίνεται ISSUE η L.D. Η τελική τιμή της R1 δεν είναι ακόμα γνωστή. Προφανώς η L.D θα πρέπει να περιμένει για 1 κύκλο. Λέω κάτι λάθος? Τι θα πρέπει να μπει στο πεδίο ADDRESS του RS Load(x)? Θα πρέπει να το αφήσω κενό και να το συμπληρώσω στον επόμενο κύκλο όπου η R1 θα έχει υπολογιστεί? Θα μπορούσα να βάλω κάτι τις μορφής Μ[0+Int1] (Int1 είναι ο RS που έχει δεσμέυση η DADDI)?
Και κάτι ακόμα...
Οι RS των εντολών MUL.D, DADDI κτλ. έχουν τα πεδία Qj και Qk που κρατούν τα ονόματα των RS από τα οποία περιμένω αποτέλεσμα. Αν αυτά τα πεδία είναι κενά έχω έτοιμα τα δεδομένα και επομένως μπορώ να συνεχίσω την εκτέλεση. Υπάρχει κάποιο ανάλογο πεδίο για τους RS των εντολών L.D? Χωρίς ένα ανάλογο πεδίο πως θα ξέρω ποιον RS θα περιμένω να ελευθερωθεί για να συνεχίσω την εκτέλεση μίας L.D?
Ζητώ συγγνώμη αν οι απαντήσεις στα ερωτήματα μου βρίσκονται κάπου στο βιβλίο ή στις διαφάνειες. Μέχρι τώρα δεν μπόρεσα να βρώ κάτι.
_________________________________________________________________ Invite your mail contacts to join your friends list with Windows Live Spaces. It's easy! http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.a...
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Μιχάλης Βήχος wrote:
Έστω οι ακόλουθες εκτελέσεις εντολών (από την άσκηση).
DADDI R1,R1,#16 BNEZ R1,foo ;Η διακλάδωση έχει προβλεφθεί TAKEN L.D F2,0(R1)
Αν δεν κάνω λάθος, τη στιγμή που που η DADDI είναι σε στάδιο WB γίνεται ISSUE η L.D. Η τελική τιμή της R1 δεν είναι ακόμα γνωστή. Προφανώς η L.D θα πρέπει να περιμένει για 1 κύκλο. Λέω κάτι λάθος? Τι θα πρέπει να μπει στο πεδίο ADDRESS του RS Load(x)? Θα πρέπει να το αφήσω κενό και να το συμπληρώσω στον επόμενο κύκλο όπου η R1 θα έχει υπολογιστεί? Θα μπορούσα να βάλω κάτι τις μορφής Μ[0+Int1] (Int1 είναι ο RS που έχει δεσμέυση η DADDI)?
Στο WB μιας εντολής ενημερώνονται όλες οι μονάδες που έχουν εξάρτηση από το αποτέλεσμα της εκτελεσθείσας εντολής[1]. Οι διαφάνειες αυτές βέβαια αναφέρονται σε FP πράξεις αλλά το ίδιο θα ισχύει και για τις Integer κα- θώς και αυτές χρησιμοποιούν τον CDB για το γράψιμο. Αρα στο κύκλο που γίνει issue η LD (ίδιος με τον κύκλο που περνά σε WB η DADDI) διαβάζει το σωστό όρισμα.
Και κάτι ακόμα...
Οι RS των εντολών MUL.D, DADDI κτλ. έχουν τα πεδία Qj και Qk που κρατούν τα ονόματα των RS από τα οποία περιμένω αποτέλεσμα. Αν αυτά τα πεδία είναι κενά έχω έτοιμα τα δεδομένα και επομένως μπορώ να συνεχίσω την εκτέλεση. Υπάρχει κάποιο ανάλογο πεδίο για τους RS των εντολών L.D? Χωρίς ένα ανάλογο πεδίο πως θα ξέρω ποιον RS θα περιμένω να ελευθερωθεί για να συνεχίσω την εκτέλεση μίας L.D?
Στην πραγματικότητα και οι load/store πρέπει να έχουν Qj πεδίο όπως φαί- νεται και από τον ψευδοκώδικα των διαφανειών. Σε παραπέμπω στο στάδιο execute των load/store στις ίδιες διαφάνειες... Μάλλον από το παράδειγμα θα λείπουν για λόγους απλότητας!
Ζητώ συγγνώμη αν οι απαντήσεις στα ερωτήματα μου βρίσκονται κάπου στο βιβλίο ή στις διαφάνειες. Μέχρι τώρα δεν μπόρεσα να βρώ κάτι.
Invite your mail contacts to join your friends list with Windows Live Spaces. It's easy! http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.a...
Advcomparch mailing list Advcomparch@lists.cslab.ece.ntua.gr http://lists.cslab.ece.ntua.gr/mailman/listinfo/advcomparch
Yπέθεσα ότι αναφέρεσαι στον Tomasulo χωρίς ROB αλλά και με ROB το ίδιο ισχύει νομίζω.
Ελπίζω να βοήθησα!
[1]Διαφάνεια 24 από Lec4-dynamic-09.pdf
- ---------------------------- Γιάννης Τσιούρης el06193@mail.ntua.gr
Μιχάλης Βήχος wrote:
Έστω οι ακόλουθες εκτελέσεις εντολών (από την άσκηση).
DADDI R1,R1,#16 BNEZ R1,foo ;Η διακλάδωση έχει προβλεφθεί TAKEN L.D F2,0(R1)
Αν δεν κάνω λάθος, τη στιγμή που η DADDI είναι σε στάδιο WB γίνεται ISSUE η L.D. Η τελική τιμή της R1 δεν είναι ακόμα γνωστή. Προφανώς η L.D θα πρέπει να περιμένει για 1 κύκλο. Λέω κάτι λάθος?
Σωστά. Αν τη στιγμή που γίνει issue η L.D, συμβουλευτεί το reg. res. status και δει ότι για τον R1 υπάρχει κάποιος rs που θα τον παράξει, τότε, όπως αναφέρει και ο ψευδοκώδικας του Tomasulo, θα πρέπει να περιμένει μέχρι να λάβει τον R1 στον επόμενο κύκλο ("Load-store step1: wait until RS[r].Qj = 0 ... , όπου Qj το rs που θα δώσει στην περίπτωσή μας τον R1)
Τι θα πρέπει να μπει στο πεδίο ADDRESS του RS Load(x)? Θα πρέπει να το αφήσω κενό και να το συμπληρώσω στον επόμενο κύκλο όπου η R1 θα έχει υπολογιστεί? Θα μπορούσα να βάλω κάτι τις μορφής Μ[0+Int1] (Int1 είναι ο RS που έχει δεσμέυση η DADDI)?
Θα μπορούσες να βάλεις κάτι σαν το M[0+Int1] ή να το αφήσεις απλά κενό όπως λες (με το σκεπτικό ότι η πληροφορία για τον Int1 θα υπάρχει ήδη μέχρι εκείνη στιγμή στο αντίστοιχο πεδίο Qj του load buffer).
Και κάτι ακόμα...
Οι RS των εντολών MUL.D, DADDI κτλ. έχουν τα πεδία Qj και Qk που κρατούν τα ονόματα των RS από τα οποία περιμένω αποτέλεσμα. Αν αυτά τα πεδία είναι κενά έχω έτοιμα τα δεδομένα και επομένως μπορώ να συνεχίσω την εκτέλεση. Υπάρχει κάποιο ανάλογο πεδίο για τους RS των εντολών L.D? Χωρίς ένα ανάλογο πεδίο πως θα ξέρω ποιον RS θα περιμένω να ελευθερωθεί για να συνεχίσω την εκτέλεση μίας L.D?
Ναι, σαφώς υπάρχει, και είναι το Qj που ανέφερα προηγουμένως. Η αλήθεια είναι ότι αυτό γενικά δεν επισημαίνεται έντονα στο βιβλίο (παρά μόνο στον ψευδοκώδικα και σε κανά-δυο παραδείγματα όπου απεικονίζονται οι load buffers), με το σκεπτικό ότι δίνεται περισσότερη έμφαση στο floating-point μέρος του pipeline και αγνοούνται οι πράξεις με integers. Αλλά προφανώς είναι κάτι που επιβάλλεται να υπάρχει για να διασφαλίσει τη σωστή λειτουργία όλων των εντολών.
Ν.
advcomparch@lists.cslab.ece.ntua.gr