CACHE
Also reagiert der direct mapped cache gegen Instruktionsströme z. B. aus Programmschleifen mit Befehlen oder Daten, die sich an der Adresse „x“ Modulo der Cachegröße befinden anfällig, da jede Speicherzelle nur einen einzigen Eintrag in der Cache-Kopie besitzt. Gibt es nun beim Zugriff auf einen solchen Cache einen Fehlversuch bei einer bestimmten Adresse „n“, muß die Maschine einen Buszylus zum Hauptspeicher initieren und man erhält solange die Schleife läuft, immer ein Miss , da man immer die gerade benötigte Instruktion durch eine neue ersetzen muß. Das nennt man auch „Trashing“. Durch die feste Zuordnung ist nur eine Blockversetzungstrategie möglich, die auf zurückliegende Zugriffe keine Rücksicht nimmt. Ist der Cache höher assoziativ organisiert, hat man also pro Hauptspeicheradresse mehrere Einträge, tritt dieser Kollisionsfall nicht oder viel seltener auf.
In einem 32-Bit Mikrorechnersystem ist ein Cache von 1kbyte vorhanden. Das Laden des Caches erfolgt in Rahmen zu je 8 Bytes. Die Hauptspeicheradresse ist 24 Bit lang. 1 Byte = 8 Bit 2 Byte = 1 Word
2 Word = 1 DWord 4 Word = 2 DWords
n Bytes = n/4 DWords
a) Wieviele Zeilen umfaßt der Cache ? Die Cache Größe kann man mit folgender Formel berechnen:
F D S
Eingesetzt in (2) wird also S = 1024 Byte / 2 D * 4 Byte = 128 Zeilen
Num (Sets) * Frames * Num (DW´s) * DW = Cache Size [Bytes]
D.h. der Cache hätte dann eine Länge von 128 Zeilen.
Formel :
Beispiele für 32 Bit Prozessoren:
C =
S * F * D * DW, wobei
= Frames, Assozität DW = DW = Num (DW´s) C = Cache Size [Bytes] = Num (Sets) ; Sets sind Sätze, Zeilen, oder Lines,
Die gesuchte Anzahl an Zeilen entspricht den Sets, d.h.: S = C / ( F * D * DW )
(2)
Da bei der Aufgabe keine Angabe über die Assozität gegeben ist, setzen wir als Einfachstes einen direct-mapped cache an. Damit wird Frames zu 1.Genauso könnte man natürlich argumentieren, daß man einen vollassoziativen Cache annimmt, oder einen üblichen 4-fach assoziativen Cache. Dies wirkt sich natürlich auf die Anzahl an notwendigen Adresskomparatoren aus, die bei voll assoziativem Cache gleich der Rahmenanzahl sind und bei n fach assoziativem Cache gleich der Anzahl Ramen pro Set sind. Bei Direct mapped cache braucht man nur noch einen Komparator. Beim vollassoziativen Cache ist die Blockversetzungs-strategie sehr aufwendig. Die kann z.B. nach dem LRU-Prizip oder zufällig erfolgen. Ein direct mapped Cache hat die Gefahr der Kollision. Das sogennante Trashingproblem tritt insbesondere in diesen Architekturen auf, da jede Speicherzelle nur einen einzigen Eintrag in der Cache-Kopie besitzt. Gibt es nun beim Zugriff auf einen solchen Cache einen Fehlversuch bei einer bestimmten Adresse „n“, muß die Maschine einen Buszyklus zum Haupt-speicher initiieren. Kommt man im Instruktionsstrom, z.B. innerhalb einer Programmschleife, an einen Befehl oder an eine Datum, das sich im Hauptspeicher an der Adresse „x“ Modulo der Cache-Größe befindet, wird man erneut ein „Cache miss“ haben und einr gerade benötigte Instrukiotn durch eine neue ersetzten müssen. Solange man sich in der Programmschleife befindet, wird sich dieser Fall ständig wiederholen - man produziert ein „Cache miss“ nach dem anderen.
µP NS32532: µP i486 µP 68040 µP 601
32 Sets * 2 Frames * 4 DW´s * 4 Bytes/DW = 1024 Bytes ≈ 1 KB 128 Sets * 4 Frames * 4 DW´s * 4 Bytes/DW = 8192 Bytes ≈ 8 KB 64 Sets * 4 Frames * 4 DW´s * 4 Bytes/DW = 4096 Bytes ≈ 4 KB 64 Sets * 8 Frames * 8 DW´s * 8 Bytes/DWord = 32768 Bytes ≈ 32 KB
b) Wie sieht die Unterteilung des Hauptspeicher aus ? Der vollassoziative Cache hat die größte Flexibilität, da jeder Block des Hauptspeichers jeden Rahmen des Caches belegen kann. Der direct mapped cache unterteilt dagegen den gesamten Arbeitsspeicher im Umfang von 2n Adressen bei 2i Einträgen in 2n-i Seiten mit jeweils 2i langen Blöcken c) Wieviele und welche Bitvergleicher werden in beiden Varianten benötigt ? Die Anzahl an notwendigen paralleler Adresskomparatoren ist bei voll assoziativem Cache gleich der Rahmenanzahl. D.h. bei einem aus n = 4 Byte breiten System ergibt sich für die Breite der Adresskomparatoren am Tag-Ram folgende Formel n * 8 - (2 * ld n) = 4 * 8 Bit/Byte - 2 * 2 = 28 Bit. Bei n-fach assoziativem Cache sind die benötigten Adress-komparatoren gleich der Anzahl Ramen pro Set. Bei direct mapped cache braucht man nur noch einen einfachen 1 aus n Decoder als Komparator, wobei n gleich der Anzahl an Zeilen des Caches ist.