[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:
- 68000
keine
- 68010
- Instruction Prefetch
zwei Wörter prefetch, ein Wort Dekodierregister
- Loop Mode
wird aktiviert, wenn eine Ein-Wort-Instruktion auf eine DBcc-Instruktion
folgt die eine Scheife auf die vorhergehende Instruktion bildet, 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
bei aktiviertem Burst-Modus wird immer eine komplette Zeile gelesen, wenn
dies die Hardware unterstützt
- Data Cache
16 Zeilen á 16 Bytes = 256 Bytes
kann Eingeschalten oder Eingefroren werden mittels CACR
immer WriteThrough
wählbarer Write Allocation Modus der dafür sorgt, dass bei Schreibzugriffen
auch entsprechende Einträge für User/Supervisor ungültig gesetzt werden
bei aktiviertem Burst-Modus wird immer eine komplette Zeile gelesen, wenn
dies die Hardware unterstützt
- 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
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]