Speicherhierarchie – Speicheradressen errechnen
In diesem Beitrag geht es darum, aus Eckdaten des Speichers, das Layout der Adresse zu errechnen, sowie konkrete Adressen ablesen zu können.
Eckdaten des Speichers:
-
einem 2-fach assoziativen 32-Byte First-Level Cache mit einer Line Size von 4 Bytes unter Nutzung von LRU, Write-Back und Write-Allocate
-
einem 4-fach assoziativen 1kByte Second-Level Cache mit einer Line Size von 4 Bytes unter Nutzung von LRU, Write-Through und No-Write-Allocate
-
einem 64kByte Hauptspeicher, der momentan mit von 0 beginnend aufsteigend hochgezählten Big-Endian 16-Bit Werten gefüllt ist (der gespeichert Wert auf Adresse 1024 ist also 512)
Skizze der Adresse
L1 Cache
Wir errechnen zuerst die Anzahl der Speicherzellen:
Größe : Line Size = Anzahl der Speicherzellen 32 : 4 = 8
Als nächstes errechnen wir die Anzahl der Indexeinträge:
Anzahl der Speicherzellen : Assoziativität = Anzahl der Indexeinträge 8 : 2 = 4
Um herauszufinden, wie viel Bits wir für die Indexdarstellung brauchen rechnen wir folgendes:
log[Zur Basis 2] von (Anzahl der Indexeinträge) = Anzahl der Bits für die Indexdarstellung log2(4) = 2
Somit hat der Index schon mal 2 von 16 Bits.
Den Offsetanteil berechnet man folgender maßen:
log[Zur Basis 2] von (Line Size) log2(4) = 2
Somit hat der Offsetanteil auch 2 von 16 Bits. Daraus ergibt sich folgende Adressaufteilung:
Adressaufteilung des L1 Caches: Offset: 0 bis 1 Index: 2 bis 3 Tag: 4 bis 15
L2 Cache
Zuerst errechnen wir wieder die Anzahl der Speicherzellen:
1024 : 4 = 256 => Anzahl der Speicherzellen
Dann errechnen wir die Anzahl der Indexeinträge:
256 : 4 = 64 => Anzahl der Indexeinträge
Nun rechnen wir Index & Offsetanteil aus:
log2(64) = 6 => Anzahl der Indexbits log2(4) = 2 => Anzahl der Offsetbits
Damit ergibt sich folgende Adressaufteilung für den L2 Cache
Offset: 0 bis 1 Index: 2 bis 7 Tag: 8 bis 15
Speicheradressen in die gewünschte Form bringen
Beispiel: $4711
Für den L1 Cache
Hexadezimal: 4711 Binär: 0100 0111 0001 0001 Somit: Tag: 0100 0111 0001 = $471 Index: 00 = $0 Offset: 01 = $1
Für den L2 Cache
Hexadezimal: 4711 Binär: 0100 0111 0001 0001 Somit: Tag: 0110 0111 = $47 Index: 0001 00 = $4 Offset: 01 = $1
Man zerlegt die Binärdarstellung der Hexadezimalzahl (Erkennbar an dem $) einfach nach dem oben errechneten Layout in die einzelnen Bestandteile.