Με αφορμή τις εκφωνήσεις στα διαγωνίσματα μου δημιουργήθηκαν κάποιες απορίες γενικού ενδιαφέροντος.
Ειδικότερα με απασχολεί η superscalar περίπτωση και η pipeline διαχείριση των Load & Stores
*SCENARIO*
Ας πούμε ότι είμαστε σε απλή non-superscalar αρχιτεκτονική και θέλουμε να εκτελέσουμε τις ακόλουθες δύο εντολές με αλγόριθμο Tomasulo:
ld r1, 0 (address) ld r2, 1 (address) Ας υποθέσουμε ότι: 1) το cache block χωραει από [address+0]...[address+7] 2) το block δεν βρίσκεται στην cache, συνεπώς έχουμε miss. 5) Hit time = 2, Miss time = 5
A) Υποθέτω ότι αν είναι non-pipelined το function unit που χρησιμοποιεί το load τότε αναγκαστικά θα τρέξει μόνο η πρώτη εντολή το EXECUTE και θα κάνει miss ενώ η δεύτερη θα περιμένει και στην συνέχεια θα κάνει hit
B) Αν τώρα υποθέσουμε ότι είναι pipelined το function unit , η ερώτηση μου είναι τότε η πρώτη και πάλι θα δει miss, και θα διαρκέσει από το 2ο εως τον 7ο γύρο αλλά η δεύτερη δεν θα δει επίσης το block να βρίσκεται στην cache και εκείνη θα κάνει και εκείνη miss ή στις caches υπάρχει κάποιο πρωτόκολλο στην περίπτωση που προσπαθήσεις να κάνεις read κάτι που βρίσκεται σε διαδικασία μεταφοράς?
Γιατί αν παράδειγμα : από το 2ο εως το 7ο τρέχει η 1η load από το 3ο εως το 8ο τρέχει 2η load Αρχίζω να αναρωτιέμαι διάφορα πράγματα για το consistency της διαδικασίας...
Γ) Επίσης σε περίπτωση που έχουμε superscalar αρχιτεκτονική και έχουμε ας πούμε δύο cdb, γράφουν ταυτόχρονα στην cache?
Δ) Τέλος κάτι ίσως προφανέστερο των παραπάνω. Αν έχουμε 2- superscalar αρχιτεκτονική π.χ και έχουμε δύο data bus, αλλά η μνήμη μας παρέχει ένα port, τότε υποθέτω ότι έχουμε bottleneck και θα αναγκαστεί η μία εκ των δύο load ακόμα και αν είναι για ανεξάρτητα block να περιμένει σωστά?
Ευχαριστώ πολύ προκαταβολικά Μανόλης.
Ειδικότερα με απασχολεί η superscalar περίπτωση και η pipeline διαχείριση των Load & Stores
*SCENARIO*
Ας πούμε ότι είμαστε σε απλή non-superscalar αρχιτεκτονική και θέλουμε να εκτελέσουμε τις ακόλουθες δύο εντολές με αλγόριθμο Tomasulo:
ld r1, 0 (address) ld r2, 1 (address) Ας υποθέσουμε ότι:
- το cache block χωραει από [address+0]...[address+7]
- το block δεν βρίσκεται στην cache, συνεπώς έχουμε miss.
- Hit time = 2, Miss time = 5
A) Υποθέτω ότι αν είναι non-pipelined το function unit που χρησιμοποιεί το load τότε αναγκαστικά θα τρέξει μόνο η πρώτη εντολή το EXECUTE και θα κάνει miss ενώ η δεύτερη θα περιμένει και στην συνέχεια θα κάνει hit
B) Αν τώρα υποθέσουμε ότι είναι pipelined το function unit , η ερώτηση μου είναι τότε η πρώτη και πάλι θα δει miss, και θα διαρκέσει από το 2ο εως τον 7ο γύρο αλλά η δεύτερη δεν θα δει επίσης το block να βρίσκεται στην cache και εκείνη θα κάνει και εκείνη miss ή στις caches υπάρχει κάποιο πρωτόκολλο στην περίπτωση που προσπαθήσεις να κάνεις read κάτι που βρίσκεται σε διαδικασία μεταφοράς?
Γιατί αν παράδειγμα : από το 2ο εως το 7ο τρέχει η 1η load από το 3ο εως το 8ο τρέχει 2η load Αρχίζω να αναρωτιέμαι διάφορα πράγματα για το consistency της διαδικασίας...
Γ) Επίσης σε περίπτωση που έχουμε superscalar αρχιτεκτονική και έχουμε ας πούμε δύο cdb, γράφουν ταυτόχρονα στην cache?
Δ) Τέλος κάτι ίσως προφανέστερο των παραπάνω. Αν έχουμε 2- superscalar αρχιτεκτονική π.χ και έχουμε δύο data bus, αλλά η μνήμη μας παρέχει ένα port, τότε υποθέτω ότι έχουμε bottleneck και θα αναγκαστεί η μία εκ των δύο load ακόμα και αν είναι για ανεξάρτητα block να περιμένει σωστά?
Ευχαριστώ πολύ προκαταβολικά Μανόλης.
+) Επίσης ένα πάλι παράδοξο σενάριο είναι να έχουμε:
ld/st r1, 0 ( address ) ld/st r2, 0 ( address' )
1) να βρίσκεται το block της address στην cache 2) το block της address και της address' στην cache συμπίπτουν Από απορία τι συμβαίνει δεδομένου ότι το hit time στο πρώτο είναι 2 ή 3 και το miss time στο r2 είναι 5. Καθώς μεταφέρεται κάτι από τον επεξεργαστή στην cache ταυτόχρονα μεταφέρεται και από την μνήμη στην cache? Πάλι το consistency μου φαίνεται περίεργο.
+) Επίσης υπάρχει και το αντίστροφο παράδοξο σενάριο είναι να έχουμε:
ld/st r1, 0 ( address ) ld/st r2, 0 ( address' )
1) να βρίσκεται το block της address' στην cache 2) το block της address και της address' στην cache συμπίπτουν Τι συμβαίνει δεδομένου ότι το miss time στο πρώτο είναι 6 και το hit time στο r2 είναι 2? Mε την διαπίστωση του miss Θα σβηστεί στον πρώτο χρόνο ότι υπάρχει στην cache ?
Καθώς μεταφέρεται κάτι από τον επεξεργαστή στην cache ταυτόχρονα μεταφέρεται και από την μνήμη στην cache? Πάλι το consistency μου φαίνεται περίεργο. ___________________________________________________ Μάλιστα ένας συνάδελφος μου επισήμανε το εξής φευγαλέο σενάριο:
ld/st r1, 0 ( address ) ld/st r2, 0 ( address' )
1) να βρίσκεται το block της address' στην cache σε LRU 2) Ας πούμε fully associative cache Τι συμβαίνει δεδομένου ότι το miss time στο πρώτο είναι 6 και το hit time στο r2 είναι 2? Mε την διαπίστωση του miss, θα σβηστεί στον πρώτο χρόνο ότι υπάρχει στην cache ? Γιατί π.χ αν δεν σβηστούν και προλάβει να διαβάσει το r2 ότι θέλει, το LRU θα μετακινηθεί και άρα τα δεδομένα της address θα έπρεπε αλλού να αποθηκευτούν ________________________________________________________________________
Ζητούμε συγγνώμη για αυτό το spamming με αυτά τα ακραία σενάρια, αλλά ομολογώ ότι όταν δίνεις περισσότερες ελευθερίες στο σύστημα και παραλληλισμούς superscalar ή pipeline μου φαίνονται κάποια πράγματα αμφίσημα. Να σας επισημάνω δε ότι όλες αυτές οι σκέψεις προκύψαν από λύσεις θεμάτων του tomasulo που φαινόντουσαν ότι κρύβανε κάποιες τέτοιες παραδοχές.
Ευχαριστούμε εκ των προτέρων για τον χρόνο σας
Μ.
Στις 7 Ιουλίου 2015 - 5:37 μ.μ., ο χρήστης Εμμανουήλ Βλατάκης-Γκαραγκούνης < tetraktida42@gmail.com> έγραψε:
Ειδικότερα με απασχολεί η superscalar περίπτωση και η pipeline διαχείριση
των Load & Stores
*SCENARIO*
Ας πούμε ότι είμαστε σε απλή non-superscalar αρχιτεκτονική και θέλουμε να εκτελέσουμε τις ακόλουθες δύο εντολές με αλγόριθμο Tomasulo:
ld r1, 0 (address) ld r2, 1 (address) Ας υποθέσουμε ότι:
- το cache block χωραει από [address+0]...[address+7]
- το block δεν βρίσκεται στην cache, συνεπώς έχουμε miss.
- Hit time = 2, Miss time = 5
A) Υποθέτω ότι αν είναι non-pipelined το function unit που χρησιμοποιεί το load τότε αναγκαστικά θα τρέξει μόνο η πρώτη εντολή το EXECUTE και θα κάνει miss ενώ η δεύτερη θα περιμένει και στην συνέχεια θα κάνει hit
B) Αν τώρα υποθέσουμε ότι είναι pipelined το function unit , η ερώτηση μου είναι τότε η πρώτη και πάλι θα δει miss, και θα διαρκέσει από το 2ο εως τον 7ο γύρο αλλά η δεύτερη δεν θα δει επίσης το block να βρίσκεται στην cache και εκείνη θα κάνει και εκείνη miss ή στις caches υπάρχει κάποιο πρωτόκολλο στην περίπτωση που προσπαθήσεις να κάνεις read κάτι που βρίσκεται σε διαδικασία μεταφοράς?
Γιατί αν παράδειγμα : από το 2ο εως το 7ο τρέχει η 1η load από το 3ο εως το 8ο τρέχει 2η load Αρχίζω να αναρωτιέμαι διάφορα πράγματα για το consistency της διαδικασίας...
Γ) Επίσης σε περίπτωση που έχουμε superscalar αρχιτεκτονική και έχουμε ας πούμε δύο cdb, γράφουν ταυτόχρονα στην cache?
Δ) Τέλος κάτι ίσως προφανέστερο των παραπάνω. Αν έχουμε 2- superscalar αρχιτεκτονική π.χ και έχουμε δύο data bus, αλλά η μνήμη μας παρέχει ένα port, τότε υποθέτω ότι έχουμε bottleneck και θα αναγκαστεί η μία εκ των δύο load ακόμα και αν είναι για ανεξάρτητα block να περιμένει σωστά?
Ευχαριστώ πολύ προκαταβολικά Μανόλης.
+) Επίσης ένα πάλι παράδοξο σενάριο είναι να έχουμε:
ld/st r1, 0 ( address ) ld/st r2, 0 ( address' )
- να βρίσκεται το block της address στην cache
- το block της address και της address' στην cache συμπίπτουν
Από απορία τι συμβαίνει δεδομένου ότι το hit time στο πρώτο είναι 2 ή 3 και το miss time στο r2 είναι 5. Καθώς μεταφέρεται κάτι από τον επεξεργαστή στην cache ταυτόχρονα μεταφέρεται και από την μνήμη στην cache? Πάλι το consistency μου φαίνεται περίεργο.
advcomparch@lists.cslab.ece.ntua.gr