Καλησπέρα,
Στην πραγματικότητα, το pipelined/non-pipelined functional unit έχει να κάνει με τον υπολογισμό της διεύθυνσης. Από τη στιγμή που ο υπολογισμός της διεύθυνσης ολοκληρωθεί, η εντολή μπορεί να σταλεί στην cache από τον load buffer (υποθέτωντας ότι έχουμε non-blocking caches).
Όσον αφορά τις ασκήσεις (όπου προσπαθούμε να βρούμε ένα τρόπο να κωδικοποιήσουμε εύκολα και κατανοητά κάποια πράγματα), επειδή δε σπάμε το χρόνο που απαιτείται στο EX για το load σε χρόνο_υπολογισμού + χρόνο_πρόσβασης, το pipelined functional unit αποτελεί ένα εύσχημο τρόπο να σας πούμε ότι μπορείς να έχεις overlapped loads.
Από εκεί και πέρα, όπως έχω εξηγήσει και στο μάθημα, όταν ο επεξεργαστής χρειαστεί κάτι από την ιεραρχία μνήμης, απευθύνεται στην cache και λέει "θέλω το block" και στη συνέχεια είτε περιμένει είτε εκτελεί όποιες εντολές παρακάτω μπορεί. Όταν η cache βρει αυτό που ζητήθηκε το δίνει πίσω στον επεξεργαστή. Προφανώς αν η cache έχει ξεκινήσει να εξυπηρετεί ένα miss για block Χ και λάβει και δεύτερο αίτημα για το ίδιο block X, δε θα ξεκινήσει τη διαδικασία από την αρχή, αλλά θα τα εξυπηρετήσει και τα δύο ταυτόχρονα.
Γ) Επίσης σε περίπτωση που έχουμε superscalar αρχιτεκτονική και έχουμε ας πούμε δύο cdb, γράφουν ταυτόχρονα στην cache?
Τα CDΒ δεν έχουν καμία σχέση με τις caches. Είναι σαφές και από τις διαφάνειες και από το βιβλιό ότι πάνω στο CDB βρίσκονται τα FUs, RSs και o ROB.
Δ) Τέλος κάτι ίσως προφανέστερο των παραπάνω. Αν έχουμε 2- superscalar αρχιτεκτονική π.χ και έχουμε δύο data bus, αλλά η μνήμη μας παρέχει ένα port, τότε υποθέτω ότι έχουμε bottleneck και θα αναγκαστεί η μία εκ των δύο load ακόμα και αν είναι για ανεξάρτητα block να περιμένει σωστά?
To τι κάνει η cache εξαρτάται από τα ports και από το αν είναι non-blocking ή όχι. Εμείς γενικά θεωρούμε ότι είναι non-blocking.
advcomparch@lists.cslab.ece.ntua.gr