CPU Cache Verwaltung

### CPU Cache Überblick

Um die Leistung zu steigern verfügen einige der CPU's der 68k Familie über die Fähigkeit Speicherzugriffe zwischenzuspeichern.
Zur Referenzierung der Caches werden immer logische Adressen, inklusive des "Function Code" verwendet. Das heißt unter anderem, dass Zugriffe im User Mode und Supervisor Mode unterschiedliche Cache-Einträge erzeugen (für genaue Informationen hierzu sollten die Motorola Prozessor Handbücher konsultiert werden).

Folgend ein Überblick über die Fähigkeiten 68k CPU's:

- 68000 keine
- 68010
  - Instruction Prefetch
    zwei Wörter prefetch, ein Wort Dekodierregister
  - Loop Mode
    ist aktiv wenn eine Ein-Wort-Instruktion auf eine DBcc-Instruktion folgt, in diesem Fall erfolgen keine Leseoperationen für die Instruktionen mehr bis zum Ende der Schleife
- 68020
  - Instruction Prefetch
    ein Langwort
  - Instruction Cache
    16 Zeilen á 16 Bytes = 256 Bytes
    kann Eingeschalten oder Eingefroren werden mittels CACR
- 68030
  - Instruction Prefetch
    ein Langwort
  - Instruction Cache
    16 Zeilen á 16 Bytes = 256 Bytes
    kann Eingeschalten oder Eingefroren werden mittels CACR
  - Data Cache
    16 Zeilen á 16 Bytes = 256 Bytes
    kann Eingeschalten oder Eingefroren werden mittels CACR
    immer WriteThrough
    wählbarer Write Allocation Modus
- 68040
  - Instruction Prefetch
    ein Langwort
  - Instruction Cache
    256 Zeilen á 16 Bytes = 4096 Bytes
    kann Eingeschalten werden mittels CACR
  - Data Cache
    256 Zeilen á 16 Bytes = 4096 Bytes
    kann Eingeschalten werden mittels CACR
    wählbarer Mode CopyBack/WriteThrough mittels MMU
- 68060
  - Instruction Prefetch
    ein Langwort
  - Instruction Cache
    512 Zeilen á 16 Bytes = 8192 Bytes
    kann Eingeschalten, Eingefroren und auf halbe Größe eingestellt werden mittels CACR
  - Branch Cache
    kann Eingeschalten werden mittels CACR
    wird von den Einstellungen der MMU nicht beeinflusst!
  - Superscalar Dispatch
    kann Eingeschalten werden mittels CACR
  - Data Cache
    512 Zeilen á 16 Bytes = 8192 Bytes
    kann Eingeschalten, Eingefroren und auf halbe Größe eingestellt werden mittels CACR
    wählbarer Mode CopyBack/WriteThrough mittels MMU
  - Push Buffer
    kann Eingeschalten werden mittels PCR
  - Store Buffer
    kann Eingeschalten werden mittels CACR
    Kacheln dürfen nicht NonCachable Serialized (precise) sein

#### Cache Verwaltung in WHDLoad

Es ist äußerst wichtig zu verstehen, dass das Verhalten der Caches von 68030..68060 mit dem Cache Control Register (CACR) und der MMU gesteuert werden!
Mittels des CACR werden die Caches global ein- oder ausgeschaltet. Mithilfe der MMU werden einzelne Kacheln (4 KByte unter WHDLoad) markiert wie diese zu cachen sind.
Auf dem 68030 können Kacheln Cacheable oder NotCacheable sein. Auf 68040/68060 können sie cachable WriteThrough, cachable CopyBack, NonCachable (impercise) oder NonCachable Serialized (precise) sein.

Wenn die MMU von WHDLoad nicht benutzt wird, erfolgt die Steuerung seitens WHDLoad ausschließlich mittels des CACR.

#### Voreingestellte Cache Konfiguration

Voreingestellt ist, dass die Speicherbereiche von WHDLoad, dem Slave und von ExpMem als cacheable CopyBack markiert sind. Der Bereich BaseMem ist markiert als NonCachable und der Data und Instruction Cache sind im CACR eingeschaltet. Dadurch läuft das Programm welches sich in BaseMem befindet ohne Caches, aber WHDLoad und der Slave laufen mit Caches für beste Geschwindigkeit.

#### Cache Einstellungen durch den Programmierer

Es gibt zwei resload Funktionen zur Kontrolle der Caches: resload_SetCACR und resload_SetCPU. Die Funktion resload_SetCACR ist die historisch ältere Funktion und kann vollständig durch resload_SetCPU ersetzt werden (intern wandelt WHDLoad die Funktionen ineinander um). Trotzdem wird die Verwendung von resload_SetCACR empfohlen für alle, die nicht absolut alles über Caches und deren Verhalten im Amiga System wissen. Mit der Funktion resload_SetCACR kann der Instruction und Data Cache seperat ein- und ausgeschaltet werden. Dabei wird nur die Möglichkeit den BaseMem Bereiches zu cachen beeinflusst.

#### Cache Einstellungen durch den Benutzer

Wenn der Programmierer saubere Arbeit geleistet hat, dann ist für den Benutzer nichts zu tun. Die bestmöglichen Einstellungen sind dann bereits im Slave vorgenommen worden.
Trotzdem mag es Gründe geben, manuell in das Cache Setup einzugreifen. Einerseits um eine Install zum Funktionieren zu bewegen, weil sie zu schnell läuft (z.B. Fehler in der Grafik) und andererseits um ein installiertes Programm zu beschleunigen.

Um Probleme mit einer Install zu Beheben oder zu Mindern kann die Option NoCache verwendet werden. Diese Option deaktiviert alle Caches und markiert den gesamten Speicher als NonCachable Serialized (precise). Zu beachten ist, dass ein Amiga mit 32-Bit Chip-Memory oder schnellerem Prozessor immer noch schneller sein wird als ein originaler A500.

Um ein installiertes Programm zu beschleunigen, können Optionen gesetzt werden die Caches aktivieren. Dies überschreibt in jedem Fall die Einstellungen die im Slave vorgenommen werden. Auf einem 68020 kann die Option Cache verwendet werden. Auf einem 68030 auch die Option DCache, welche die Option Cache mit einschließt. Auf einem 68060 sind noch mehr Optionen möglich: BranchCache, StoreBuffer und SuperScalar. Die Option ChipNoCache/S kann ebenfalls die Geschwindigkeit auf einem 68040 oder 68060 verbessern, siehe nächster Abschnitt.

#### Cachemöglichkeiten im Chip-Memory

Die Möglichkeit Speicherbereiche zu cachen wird nicht nur durch die CPU (CACR) und die Einstellungen durch die MMU festgelegt, sondern kann auch durch externe Hardware beeinflusst werden. Die CPU signalisiert bei einem Speicherzugriff am Bus ob dieser gecached werden soll. Eine externe Hardware kann während des Buszugriffs signalisieren, dass dieser Speicherzugriff nicht gecached werden darf.
Der Mechanismus, dass Hardware der CPU signalisiert, dass bestimmte Speicherbereiche nicht gecached werden sollen, ist meines Wissens auf allen Amigas oder Beschleunigerkarten mit einer CPU >= 68030 (wegen dem Data Cache) implementiert. Davon betroffen ist das gesamte Chip-Memory und der IO-Bereich (Cia/Custom/RTC), welcher bei Datenzugriffen nicht gecached werden darf. Dies ist notwendig um Inkonsistenzen, z.B. wegen DMA-Aktivitäten, zu vermeiden.
Die Reaktion der CPU auf einen Zugriff der gecached werden soll, aber von der Hardware als NonCacheable markiert wird, ist von CPU zu CPU unterschiedlich. Auf einem 68030 hat dies keinen Einfluss auf die Geschwindigkeit, der Zugriff wird dann einfach nicht gecached. Auf einem 68040 laufen Lesezugriffe mit normaler Geschwindigkeit ab. Schreibzugriffe (CopyBack) dagegen werden abgebrochen und im Modus 'nicht zu cachen' neu gestartet. Dies resultiert in einem ca. 5-fach langsameren Speicherzugriff (abhänging von Hardware und Taktfrequenz der CPU) im Vergleich zu einem von vornherein nicht gecached Zugriff. Auf einem 68060 werden sowohl Lese- als auch Schreibzugriffe abgebrochen und neugestartet. Lesezugriffe werden dadurch ca. 3 mal langsamer und Schreibzugriffe etwa 5 mal.
Das beschriebene Verhalten bezieht sich auf Datenzugriffe. Zugriffe auf Instruktionen sind davon gewöhnlich nicht betroffen, sie sind auch im Chip-Memory cacheable. Allerdings gibt es einige Beschleunigerkarten (mutmaßlich mit fehlerhaftem Hardwaredesign) die auch das Cachen von Instruktionen im Chip-Memory nicht erlauben. Auf solcher Hardware sollte die Option ChipNoCache/S verwendet werden um eine Verminderung der Ablaufgeschwindigkeit um etwa den Faktor 2 bei versuchten Cache Zugriffen zu vermeiden.

Um das Verhalten auf gegebener Hardware zu testen kann der Speed.Slave, welcher sich im Verzeichnis `src/memory-speed` des Developer-Archives befindet, verwendet werden.

#### Write Allocation

Die Write Allocation kontrolliert die Cache Behandlung auf dem 68030, wenn ein Cache Miss bei einem Schreibzugriff auftritt. Die Write Allocation muss eingeschalten werden, wenn Teile des installierten Programmes im User Mode laufen. Wenn das installierte Programm ausschließlich im Supervisor Mode läuft, kann die Write Allocation ausgeschaltet werden. Dies mag einen kleinen Geschwindigkeitsvorteil bringen.

#### Branch Cache

Der Branch Cache ist nur im 68060 vorhanden. Er ist ein Cache nur für Sprungbefehle. Im Unterschied zum Instruction Cache wird er nicht vom MMU Setup beeinflusst! Dies bedeutet, dass auch wenn die entsprechende Speicherkachel als Non Cacheable markiert ist, Sprungbefehle gecached werden, wenn der Branch Cache aktiviert ist.

Für weitere und genauere Informationen sollten die Motorola Prozessor Handbücher konsultiert werden. Bezüglich Korrekturen oder Ergänzungen bitte mich kontaktieren.