[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

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:

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 (imprecise) 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, der Slave und ExpMem laufen mit Caches für beste Geschwindigkeit. Wenn die MMU von WHDLoad nicht verwendet wird, führt das dazu, dass beide Caches ausgeschaltet werden weil ohne MMU nicht die Möglichkeit besteht für verschiedene Speicherbereiche unterschiedliche Cache Einstellungen zu verwenden. Somit führt die Einstellung eines Speicherbereiches als NonCacheable dazu, dass alle Caches ausgeschaltet werden müssen.

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.

Burst-Modus

Der Burst-Modus beim 68030 veranlasst die CPU wenn sich ein Eintrag nicht im Cache befindet (Cache miss) immer eine gesamte Zeile (16 Bytes) auf einmal aus dem Speicher zu lesen und im Cache zu platzieren auch wenn zum Beispiel nur ein Langwort benötigt wird. Der Burst-Modus muss dabei von der Hardware unterstützt werden. Wenn dies nicht der Fall ist wird ein normaler Zugriff durchgeführt, ohne dass dies einen Geschwindigkeitsnachteil bringt. Der Burst-Modus kann getrennt für den Daten-Cache und den Instruktions-Cache eingeschalten werden. Da ein Burst-Zugriff länger dauert als ein einzelner Zugriff führt der Burst-Modus nur zu einer Geschwindigkeitssteigerung, wenn auch die meisten anderen Daten der gelesenen Cache-Zeile benötigt werden bevor die Cache-Zeile wieder verworfen wurde. Für den Instruktions-Cache bringt der Burst-Modus in aller Regel eine Geschwindigkeitssteigerung. Für den Daten-Cache meistens nur wenn eine Vielzahl sequentiell fortlaufender Datenzugriffe erfolgen. WHDLoad aktiert den Instruktions-Burst automatisch wenn der Instruktions-Cache eingeschalten wird beginnend mit WHDLoad Version 18.0. Der Daten-Burst wird von WHDLoad nicht aktiviert.

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.
[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]