DarthMoul
28-07-2004, 13:00
Μεταξύ της CPU και του cache υπάρχει ένας αριθμός από write buffers. Μέσα στα write buffers είναι αποθηκευμένες οι τελευταίες μεταβλητές που έχουν προκαλέσει cache miss. Όσο υπάρχει έστω και μία άδεια buffer, όλα τρέχουν πολύ γρήγορα. Μόλις όμως γεμίσουν ξεκινά μία διαδικασία ενημέρωσης. Όσο διαρκεί η ενημέρωση του cache από τα buffers, κάθε προσπάθεια εγγραφής της μνήμης μπλοκάρετε. Αν όμως έχουμε φροντίσει να κρατήσουμε χρήσιμα πράγματα μέσα στους registers, θα μπορούσαμε να κάνουμε κάποια επεξεργασία, για να μην έχουμε την CPU να κάθεται χάνοντας άδικα τους κύκλους της.
Στους P3 υπάρχουν 12 buffers με μέγεθος 256 bits η κάθε μία. Με άλλα λόγια το κάθε write buffer έχει μέγεθος όσο ένα cache line. Αντίστοιχα οι P4 έχουν 24 write buffers με μέγεθος 512 bits η κάθε μία.
Στους Athlon τώρα έχουμε 12 buffers όπως και στους P3, των οποίων το μέγεθος η AMD μάλλον ξέχασε να γράψει στο manual, αλλά νομίζω πως είναι ασφαλές να υποθέσουμε τα 512bits.
Η πολιτική που ακολουθούν οι Intel και AMD στην ενημέρωση είναι διαφορετική. Η AMD ενημερώνει πάντα το L1 cache. Η Intel το L1 ή το L2 ανάλογα με το που βρήκε το cache miss. Συνεπώς έχουν και διαφορετική συμπεριφορά. Οι Pentium, όταν έχουν βρει cache miss κατά την διάρκεια εγγραφής μεγάλων blocks από δεδομένα, δηλαδή blocks που είναι μεγαλύτερα από το Dcache, θα παρακάμψουν την L1 εντελώς και θα ενημερώσουν απευθείας την L2, κρατώντας την L1 καθαρή από άχρηστα δεδομένα.
Αυτό είναι καλό γιατί μειώνει τα μελλοντικά cache misses στην L1 που είναι πολύ κοντά στην CPU, αλλά σχετικά αργό σαν διαδικασία. Από την άλλη οι Athlon που ενημερώνουν πάντα την L1, είναι γρηγορότεροι, και κατά συνέπεια όταν θα επικαλύψουμε την ενημέρωση του cache με υπολογισμούς, θα είναι μικρότερη η πιθανότητα ο υπολογισμός να τελειώσει πριν την ενημέρωση και να χάσουμε κύκλους μηχανής περιμένοντας. Όμως όταν θα έρθει η ώρα να επεξεργαστούμε ή μετακινήσουμε μεγάλους όγκους δεδομένων, θα υποφέρουμε από τα cache misses και την μείωση του memory bandwidth που προκαλούν. Αυτός είναι και ο λόγος που οι κατασκευαστές databases έβλεπαν πάντα τους Athlon με μισό μάτι. Tα databases για να μειώσουν τις προσπελάσεις του δίσκου που είναι πολύ αργές, κάνουν buffering με όσο μεγαλύτερα blocks μπορούν. Η Intel για να μειώσει την απώλεια χρόνου στην περίπτωση που κάποια από τα δεδομένα που μόλις γράφτηκαν στην L2, χρειαστούν άμεσα στην L1 και προκαλέσουν cache miss, ένωσε την L1 και την L2 με bus 256 bits σε αντίθεση με τα 64 bits του Athlon (και 128 του A64).
Παρακάτω θα κάνουμε και ένα παράδειγμα, για να δούμε πως επικαλύπτουμε το write buffer flush με υπολογισμούς.
Στους P3 υπάρχουν 12 buffers με μέγεθος 256 bits η κάθε μία. Με άλλα λόγια το κάθε write buffer έχει μέγεθος όσο ένα cache line. Αντίστοιχα οι P4 έχουν 24 write buffers με μέγεθος 512 bits η κάθε μία.
Στους Athlon τώρα έχουμε 12 buffers όπως και στους P3, των οποίων το μέγεθος η AMD μάλλον ξέχασε να γράψει στο manual, αλλά νομίζω πως είναι ασφαλές να υποθέσουμε τα 512bits.
Η πολιτική που ακολουθούν οι Intel και AMD στην ενημέρωση είναι διαφορετική. Η AMD ενημερώνει πάντα το L1 cache. Η Intel το L1 ή το L2 ανάλογα με το που βρήκε το cache miss. Συνεπώς έχουν και διαφορετική συμπεριφορά. Οι Pentium, όταν έχουν βρει cache miss κατά την διάρκεια εγγραφής μεγάλων blocks από δεδομένα, δηλαδή blocks που είναι μεγαλύτερα από το Dcache, θα παρακάμψουν την L1 εντελώς και θα ενημερώσουν απευθείας την L2, κρατώντας την L1 καθαρή από άχρηστα δεδομένα.
Αυτό είναι καλό γιατί μειώνει τα μελλοντικά cache misses στην L1 που είναι πολύ κοντά στην CPU, αλλά σχετικά αργό σαν διαδικασία. Από την άλλη οι Athlon που ενημερώνουν πάντα την L1, είναι γρηγορότεροι, και κατά συνέπεια όταν θα επικαλύψουμε την ενημέρωση του cache με υπολογισμούς, θα είναι μικρότερη η πιθανότητα ο υπολογισμός να τελειώσει πριν την ενημέρωση και να χάσουμε κύκλους μηχανής περιμένοντας. Όμως όταν θα έρθει η ώρα να επεξεργαστούμε ή μετακινήσουμε μεγάλους όγκους δεδομένων, θα υποφέρουμε από τα cache misses και την μείωση του memory bandwidth που προκαλούν. Αυτός είναι και ο λόγος που οι κατασκευαστές databases έβλεπαν πάντα τους Athlon με μισό μάτι. Tα databases για να μειώσουν τις προσπελάσεις του δίσκου που είναι πολύ αργές, κάνουν buffering με όσο μεγαλύτερα blocks μπορούν. Η Intel για να μειώσει την απώλεια χρόνου στην περίπτωση που κάποια από τα δεδομένα που μόλις γράφτηκαν στην L2, χρειαστούν άμεσα στην L1 και προκαλέσουν cache miss, ένωσε την L1 και την L2 με bus 256 bits σε αντίθεση με τα 64 bits του Athlon (και 128 του A64).
Παρακάτω θα κάνουμε και ένα παράδειγμα, για να δούμε πως επικαλύπτουμε το write buffer flush με υπολογισμούς.