Χειρισμός CPU Cache

### Γενικά για CPU Cache

Για να βελτιώσουν την απόδοσή τους μερικοί από τους επεξεργαστές της οικογένειας 68k μπορούν να κρατάνε στην cache διευθύνσεις μνήμης.
Στα Caches αναφερόμαστε παντα με λογικές διευθύνσεις, συμπεριλαμβανομένου του κώδικα συνάρτησης της πρόσβασης. Αυτό σημαίνει ότι η πρόσβαση σε User Mode και Supervisor Mode θα δημιουργήσει διαφορετικές καταχωρήσεις Cache (παρακαλώ συμβουλευτείτε τα εγχειρίδια της Motorola για περισσότερες πληροφορίες).

Ακολουθεί μία περιγραφή των δυνατοτήτων caching στους 68k CPU:

- 68000 τίποτα
- 68010
  - Instruction Prefetch
    δύο words prefetch, ένας καταχωρητής αποκωδικοποίησης word
  - Loop Mode
    εδώ μπαίνει όταν μία εντολή word ακολουθείται από ένα DBcc, δεν υπάρχουν άλλες λήψεις εντολών μέχρι το τέλος του loop
- 68020
  - Instruction Prefetch
    μία long word
  - Instruction Cache
    16 γραμμές á 16 byte = 256 byte
    μπορεί να ενεργοποιηθεί ή να παγώσει μέσω του CACR
- 68030
  - Instruction Prefetch
    μία long word
  - Instruction Cache
    16 γραμμές á 16 byte = 256 byte
    μπορεί να ενεργοποιηθεί ή να παγώσει μέσω του CACR
  - Data Cache
    16 γραμμές á 16 byte = 256 byte
    μπορεί να ενεργοποιηθεί ή να παγώσει μέσω του CACR
    πάντα WriteThrough
    επιλεγόμενο Write Allocation mode
- 68040
  - Instruction Prefetch
    μία long word
  - Instruction Cache
    256 γραμμές á 16 byte = 4096 byte
    can be enabled via the CACR
  - Data Cache
    256 γραμμές á 16 byte = 4096 byte
    μπορεί να ενεργοποιηθεί μέσω του CACR
    επιλεγόμενα modes CopyBack/WriteThrough μέσω MMU
- 68060
  - Instruction Prefetch
    μία long word
  - Instruction Cache
    512 γραμμές á 16 byte = 8192 byte
    μπορεί να ενεργοποιηθεί, να παγώσει και να μειωθεί στο μισό μέγεθος μέσω του CACR
  - Branch Cache
    μπορεί να ενεργοποιηθεί μέσω του CACR
    δεν επηρρεάζεται από το MMU setup!
  - Superscalar Dispatch
    μπορεί να ενεργοποιηθεί μέσω του CACR
  - Data Cache
    512 γραμμές á 16 byte = 8192 byte
    μπορεί να ενεργοποιηθεί, να παγώσει και να μειωθεί στο μισό μέγεθος μέσω του CACR
    επιλεγόμενα modes CopyBack/WriteThrough μέσω MMU
  - Push Buffer
    μπορεί να απενεργοποιηθεί μέσω του PCR
  - Store Buffer
    μπορεί να ενεργοποιηθεί μέσω του CACR
    Οι σελίδες δεν πρέπει να είναι NonCachable Serialized (precise)

#### Διαχείριση Cache στο WHDLoad

Το πρώτο σημαντικό πράγμα που πρέπει να κατανοηθεί είναι ότι τα caches στους 68030..68060 ελέγχονται από τον Cache Control Register (CACR) και το MMU (με την προϋπόθεση ότι το WHDLoad χρησιμοποιεί και ελέγχει το MMU)!
Στον CACR τα caches θα είναι καθολικά ενεργοποιημένα ή απενεργοποιημένα. Με τη χρήση του MMU συγκεκριμένες Σελίδες (των 4 KByte με το WHDLoad) θα σημειωθούν για το ότι μπορούν να είναι cached.
Στον 68030 μία σελίδα μνήμης μπορεί να είναι Cacheable ή NotCacheable. Σε έναν 68040/68060 μπορεί να είναι cachable WriteThrough, cachable CopyBack, NonCachable (impercise) ή NonCachable Serialized (precise).

Εάν το MMU δεν χρησιμοποιηθεί από το WHDLoad, τότε ελέγχει μόνο τον CACR.

#### Προεπιλεγμένες Ρυθμίσεις Cache

Από προεπιλογή οι περιοχές του WHDLoad, του Slave και ExpMem σημειώνονται ως cacheable CopyBack. Η περιοχή BaseMem σημειώνεται ως NonCachable, και τα Data και Instruction Cache ενεργοποιούνται στον CACR. Οπότε το πρόγραμμα που βρίσκεται στην περιοχή BaseMem τρέχει χωρίς Caches αλλά το WHDLoad και το Slave χρησιμοποιούν τα Caches για καλύτερη απόδοση.

#### Έλεγχος Cache για Προγραμματιστές

Υπάρχουν δύο συναρτήσεις resload που ελέγχουν τα Caches: resload_SetCACR και resload_SetCPU. Η resload_SetCACR είναι η ιστορικά παλιότερη ρουτίνα και μπορεί να αντικατασταθεί πλήρως από την resload_SetCPU (Το WHDLoad εσωτερικά κρατάει τις παραμέτρους της resload_SetCACR και καλεί την resload_SetCPU). Τελικά η χρήση της resload_SetCACR συνιστάται για όλους τους ανθρώπους που δεν ξέρουν αρκετά για τα Caches και τη συμπεριφορά τους σε ένα σύστημα Amiga. Χρησιμοποιώντας την resload_SetCACR τα instruction και data cache μπορούν ανεξάρτητα να ενεργοποιηθούν ή να απενεργοποιηθούν. Η resload_SetCACR επηρρεάζει μόνο τη δυνατότητα cache της περιοχής BaseMem.

#### Έλεγχος Cache για Χρήστες

Αν ο προγραμματιστής έχει κάνει καλά τη δουλειά του τότε ο χρήστης δεν έχει τίποτα να κάνει σχετικά με τα Caches γιατί όλες οι απαραίτητες ρυθμίσεις έχουν ήδη γίνει από το Slave.
Ωστόσο ίσως υπάρχουν δύο λόγοι για να αλλάξει χειροκίνητα η ρύθμιση Cache. Πρώτον να κάνετε μία εγκατάσταση να δουλέψει σωστά γιατί έχει πρόβλημα επειδή τρέχει πολύ γρήγορα (π.χ. δημιουργεί παράσιτα στα γραφικά) και δεύτερον για να κάνετε ένα εγκατεστημένο πρόγραμμα ποιό γρήγορο.

Για να κάνετε ένα πρόγραμμα που δεν λειτουργεί να λειτουργήσει, η επιλογή NoCache μπορεί να χρησιμοποιηθεί. Αυτή η επιλογή απενεργοποιεί όλα τα τα caches και σημειώνει όλη τη μνήμη ως NonCachable Serialized (precise). Αν το μηχάνημα έχει 32-bit Chip-Memory θα συνεχίσει να είναι γρηγορότερο από μία αυθεντική A500.

Για να κάνετε ένα εγκατεστημένο πρόγραμμα γρηγορότερο μπορούν να οριστούν μερικές επιλογές που θα ενεργοποιήσουν τα Caches. Αυτό θα αντικαταστήσει τις ρυθμίσεις του Slave. Σε έναν 68020 η επιλογή Cache μπορεί να οριστεί. Σε 68030 επίσης η επιλογή DCache μπορεί να οριστεί που συμπεριλαμβάνει την επιλογή Cache. Στον 68060 υπάρχουν περισσότερες επιλογές: BranchCache, StoreBuffer και SuperScalar. Η επιλογή ChipNoCache/S μπορεί να βελτιώσει την απόδοση σε 68040 και 68060, δείτε παρακάτω.

#### Δυνατότητα Cache της Μνήμης Chip

Η δυνατότητα cache μπορεί να οριστεί όχι μόνο για τον ίδιο τον επεξεργαστή (CACR) και τις ρυθμίσεις του MMU αλλά επίσης και για εξωτερικό hardware. Ο CPU δίνει σήμα στο bus αν προσπαθεί να βάλει στη cache μία πρόσβαση. Και το εξωτερικό hardware μπορεί να στείλει σήμα στον CPU (μετά από τοποθέτηση μίας διεύθυνσης στο address bus κατά τη διάρκεια πρόσβασης μνήμης) ότι κάποια πρόσβαση δεν πρέπει να μπει στην cache.
Ο μηχανισμός που το hardware στέλνει σήμα στον CPU ότι η μνήμη πρέπει ή δεν πρέπει να μπει στη cache χρησιμοποιείται σε όλες τις (AFAIK) Amiga και τα CPU-Boards που περιέχουν CPU >= 68030 (επειδή έχουν data cache). Επηρρεαζόμενες είναι όλη η Chip-Memory και το IO-Space (Cia/Custom/RTC) που δεν πρέπει να μπουν στη cache από το data cache. Αυτό είναι απαραίτητο για να αποφευχθούν ασυμφωνίες της cache, για παράδειγμα λόγω δραστηριότητας DMA.
Η αντίδραση του CPU σε μία άρνηση από hardware για τοποθέτηση πρόσβασης στην cache διαφέρει σε διαφορετικούς CPU. Στον 68030 δεν υπάρχει επίπτωση στην απόδοση της πρόσβασης, τα δεδομένα απλά δεν θα μπούν στη cache. Στον 68040 οι προσβάσεις ανάγνωσεις θα γίνουν σε πλήρη ταχύτητα αλλά οι προσβάσεις εγγραφής (CopyBack) θα ακυρωθούν και θα ξεκινήσουν πάλι χωρίς να μπαίνουν στη cache με αποτέλεσμα περίπου 5 φορές (εξαρτάται από το hardware και την ταχύτητα του CPU) αργότερη πρόσβαση σε σύγκριση με μία πρόσβαση χωρίς cache. Στον 68060 οι προσβάσεις ανάγνωσης και εγγραφής θα ακυρωθούν και θα ξεκινήσουν πάλι. Οι προσβάσεις ανάγνωσεις θα είναι περίπου 3 φορές αργότερες και οι προσβάσεις εγγραφής θα είναι περίπου 5 φορές αργότερες.
Τα αναφερόμενα θέματα σχετίζονται με προσβάσεις δεδομένων. Οι προσβάσεις εντολών συνήθως δεν επηρρεάζονται και είναι cacheable μέσα στην Chip-Memory. Υπάρχει κάποιο (ίσως προβληματικό) hardware που δεν επιτρέπει εντολές να μπαίνουν στη cache από την Chip-Memory. Σε τέτοιο hardware η επιλογή ChipNoCache/S πρέπει να χρησιμοποιηθεί για να αποφευχθεί μεγάλη καθυστέρηση στην ταχύτητα εκτέλεσης γιατί διαφορετικά οι προσβάσεις εντολών θα είναι περίπου 2 φορές αργότερες.

Μπορείτε να ελέγξετε αυτή τη συμπεριφορά στο μηχάνημά σας εκτελώντας το Speed.Slave που περιέχεται στο κατάλογο `src/memory-speed` του αρχείου προγραμματιστών.

#### Write Allocation

Η Write Allocation ελέγχει το χειρισμό της cache στον 68030 όταν συμβαίνει αστοχία cache σε μία διαδικασία εγγραφής. Η Write Allocation πρέπει να είναι ενεργοποιημένη όταν μέρη του εγκατεστημένου προγράμματος τρέχουν σε User Mode. Αν το εγκατεστημένο πρόγραμμα τρέχει μόνο σε Supervisor Mode η Write Alloction μπορεί να απενεργοποιηθεί, που μπορεί να δώσει ένα μικρό βοήθημα απόδοσης.

#### Branch Cache

Η Branch Cache είναι διαθέσιμη μόνο σε 68060. Είναι ένα είδος cache εντολών για εντολές branch. Αλλά σε αντίθεση με την cache εντολών δεν επηρρεάζεται από τις ρυθμίσεις του MMU! Αυτό σημαίνει ότι ακόμα και όταν η κατάλληλη Σελίδα μνήμης έχει σημειωθεί ως Non Cacheable, οι εντολές branch θα είναι cached εάν η Branch Cache είναι ενεργοποιημένη.

Διαβάστε τα Motorola Microprocessors User Manuals για περισσότερες πληροφορίες. Εάν έχετε κάτι να προσθέσετε ή να διορθώσετε σε αυτή τη σελίδα παρακαλώ επικοινωνήστε μαζί μου.