update
BIN
Writerside/images/image_502.png
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
Writerside/images/image_503.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
Writerside/images/image_504.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
Writerside/images/image_505.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
Writerside/images/image_506.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
Writerside/images/image_507.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Writerside/images/image_508.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Writerside/images/image_509.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
Writerside/images/image_510.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
Writerside/images/image_511.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
Writerside/images/image_512.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Writerside/images/image_513.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Writerside/images/image_514.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Writerside/images/image_515.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
Writerside/images/image_516.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
Writerside/images/image_517.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
Writerside/images/image_518.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
Writerside/images/image_519.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
Writerside/images/image_520.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
Writerside/images/image_521.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
Writerside/images/image_522.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
Writerside/images/image_523.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
Writerside/images/image_524.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Writerside/images/image_525.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Writerside/images/image_526.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Writerside/images/image_527.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
Writerside/images/image_528.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Writerside/images/image_529.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
Writerside/images/image_530.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
Writerside/images/image_531.png
Normal file
After Width: | Height: | Size: 46 KiB |
@ -68,6 +68,7 @@
|
||||
</toc-element>
|
||||
<toc-element toc-title="Rechnersysteme">
|
||||
<toc-element topic="Rechnersysteme_Intro.md"/>
|
||||
<toc-element topic="Caches.md"/>
|
||||
|
||||
</toc-element>
|
||||
</toc-element>
|
||||
|
227
Writerside/topics/RA/Caches.md
Normal file
@ -0,0 +1,227 @@
|
||||
# Caches
|
||||
## Cache-Speicher
|
||||

|
||||
- Deutlich schneller als Zugriff auf Hauptspeicher
|
||||
- viel kleiner als Hauptspeicher
|
||||
|
||||
## Grundprinzipien
|
||||

|
||||
|
||||
## Speicher-Zugriff über Cache
|
||||
- Transparenter Zugriff für die CPU
|
||||
- Zugriff auf Speicher anhand der Speicheradresse aus der CPU
|
||||
- Daten werden zurückgeliefert
|
||||
- dazwischen: Cache
|
||||
|
||||
## Aufbau Cache Speicher
|
||||

|
||||
- Cache Line
|
||||
- Einheit für Kopie eines Memory-Blocks
|
||||
- mehrere Worte
|
||||
- Index
|
||||
- Adressiert die Cache-Line
|
||||
- Data
|
||||
- Daten aus dem Speicher
|
||||
- V
|
||||
- Valid Bit
|
||||
- 1 = Vorhanden
|
||||
- 0 = nicht Vorhanden (_Anfangswert_)
|
||||
- Tag
|
||||
- Blockadresse
|
||||
- welcher zum Index passende Memory-Block ist abgelegt?
|
||||
|
||||
### Offset
|
||||
#### Zugriff innerhalb des Caches
|
||||
- Mit Offset innerhalb der Cacheline auf einzelne Wörter/Bytes zugreifen
|
||||
- Beispiel
|
||||
- Byte-Offset im Speicher
|
||||
- 2Bit
|
||||
- Größe Cache-Line
|
||||
- 4 Byte
|
||||
- Wort-Offset für Adressierung der Wörter in Cache-Line
|
||||
- 2 Bit
|
||||
- Offset in ADresse gesamt
|
||||
- 4 Bit
|
||||
|
||||
#### Offset Beispiel
|
||||

|
||||

|
||||
|
||||
### Index: Cache Adressierung
|
||||

|
||||
- Speicherort wird durch Index-Teil der Adresse bestimmt
|
||||
- $Cacheadresse = Speicheradresse \mod ZeilenImCache$
|
||||
|
||||
|
||||
### Tag: Zuordnung der Daten
|
||||
- Woher ist bekannt welcher Block im Speicher abgelegt ist
|
||||
- Speichern der Blockadresse (TAG) und der Daten
|
||||
- 
|
||||
|
||||
### Assoziativität: Cache-Zeilen mit gleichem Index
|
||||

|
||||
- Durch weiteren Satz von Cache-Lines
|
||||
- Daten mit gleichem Index aber unterschiedlichen Tags speichern
|
||||
- 
|
||||
|
||||
#### Grad der Assoziativität
|
||||
- höhere Assoziativität verringert Fehlerzugriffrate
|
||||
- 1-Fach: 10,3%
|
||||
- 2-Fach: 8,6%
|
||||
- 4-Fach: 8,3%
|
||||
- 8-Fach: 8,1%
|
||||
|
||||
|
||||
## Cache-Beispiel
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
## Zusammenfassung Adressierung
|
||||

|
||||
|
||||
## Cache Organisation (Assoziativität)
|
||||
- [Direkt abgebildet (direct mapped)](#direkt-abbildender-cache)
|
||||
- ein Datenwort kann in einem Eintrag abgelegt sein
|
||||
- 
|
||||
- [Voll assoziativ (fully associative)](#voll-assoziativer-cache)
|
||||
- ein Datenwort kann in einem beliebigen Cache-Eintrag abgelegt sein
|
||||
- 
|
||||
- [Satz assoziativ (set associative)](#n-fach-satzassoziativer-cache)
|
||||
- ein Datenwort kann in wenigen Cache-Einträgen (_typischerweise 2-8_) abgelegt sein
|
||||
- 
|
||||
|
||||
### Direkt abbildender Cache
|
||||

|
||||
|
||||
### Voll assoziativer Cache
|
||||

|
||||
|
||||
### N-Fach satzassoziativer Cache
|
||||

|
||||
|
||||
## Lesezugriff
|
||||
- Wenn Prozessor Wort aus Hauptspeicher lesen will
|
||||
- Cache-Logik prüft, ob Wort schon im Cache ist
|
||||
- **cache hit**
|
||||
- Daten im Cache
|
||||
- Wort an Prozessor weitergeben
|
||||
- Trefferrate = Treffer / Zugriffsrate
|
||||
- **cache miss**
|
||||
- Daten nicht im Cache
|
||||
- Daten aus HS lesen
|
||||
- Fehlerzugriffsrate = 1 - Trefferrate
|
||||
- 
|
||||
|
||||
|
||||
## Lesen von Daten
|
||||
### Ersetzungsstrategien im assoziativen Cache
|
||||
- Falls Wort nicht im Cache vorhanden
|
||||
- aus Speicher in Cache laden
|
||||
- Bei direkt abgebildeten Cache
|
||||
- Zuordnung der Adresse des Wortes zu einer Cache-Zeile eindeutig
|
||||
- Beim assoziativen Cache verschiedene Strategien möglich
|
||||
- **Least Recently Used (LRU)**
|
||||
- Wählt Zeile, die am längsten nicht genutzt wurde
|
||||
- Für mehr als 4-Fach zu aufwendig
|
||||
- **Zufällig**
|
||||
- Wähle zufällige Zeile
|
||||
- Ähnliche Trefferrate wie LRU bei hoher Assoziativität
|
||||
- **Round-Robin**
|
||||
- Zyklischer Zugriff
|
||||
|
||||
### Initiales Lesen von Daten
|
||||
- Zwei Lese- / Füllstrategien
|
||||
- **on demand, demand fetching**
|
||||
- Beim ersten Lesen einer Information aus HS
|
||||
- ganze Zeile in Cache laden, falls noch nicht drin
|
||||
- **Prädiktiv, prefetch**
|
||||
- Vorhersage, welche Speicherzeilen gebraucht werden
|
||||
- Während Leerlaufphasen in Cache vorladen
|
||||
- Zweiter Programmzähler (Remote PC)
|
||||
- Künftigen Programmablauf bestimmen
|
||||
- Gut weil
|
||||
- Bessere Nutzung [räumlicher Lokalität](Rechnersysteme_Intro.md#r-umliche-lokalit-t)
|
||||
- Prefetching durch Hardware
|
||||
- Stream Buffers zwischen Cache und Speicher
|
||||
- Prefetching durch Software
|
||||
- ```c++
|
||||
for (int i = 0; i < 1024; i++){
|
||||
prefetch (array1 [i+k]); // stride k
|
||||
array1[i] = 2* array1[i];
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Schreibzugriff
|
||||
- Daten in Cache und HS müssen konsistent bleiben
|
||||
- Wenn Prozess Speicherstelle schreiben möchte, die schon im Cache ist
|
||||
- **write-through**
|
||||
- Schreiben erfolgt sowohl im Cache als auch im HS
|
||||
- langsame Schreibzugriffe
|
||||
- **write-back**
|
||||
- Schreiben nur im Cache
|
||||
- Eintrag markieren
|
||||
- _dirty bit_
|
||||
- Wenn Cache-Line verdrängt wird in HS schreiben
|
||||
- _Gefahr Inkonsistenz_
|
||||
- **No-write**
|
||||
- Wort nur im HS schreiben
|
||||
- im Cache als invalid markieren
|
||||
- langsame Schreibzugriffe
|
||||
- ggf. danach langsame Lesezugriffe
|
||||
|
||||
### Initiales Schreiben von Daten
|
||||
- **write-around**
|
||||
- nur in HS schreiben
|
||||
- **write-allocate**
|
||||
- fetch on write
|
||||
- erst Cache-Line in den Cache, dann wie oben
|
||||
|
||||
### Übliche Kombinationen
|
||||
- write-allocate → write-back
|
||||
- write around → write through
|
||||
|
||||
### Schreib-Buffer
|
||||
- 
|
||||
- beschleunigt Schreiben, da kein Stall erfolgt
|
||||
- Wenn Buffer voll ist
|
||||
- strukturelle Abhängigkeit
|
||||
- Warten bis Schreiben in HS abgearbeitet ist
|
||||
- Bei direkt folgendem Lesezugriff auf zu schreibende Daten
|
||||
- Datenabhängigkeit
|
||||
|
||||
|
||||
## Cache Spezifikation
|
||||
- Definiert durch
|
||||
- Anzahl der Cache-Zeilen C
|
||||
- Größe einer Cache-Zeile L
|
||||
- Assoziativität m
|
||||
- Daraus lässt sich bestimmen
|
||||
- Aufteilung der ADress in Offset, Index, Tag
|
||||
- [Gesamtgröße Cache](#gesamtgr-e-cache)
|
||||
|
||||
## Gesamtgröße Cache
|
||||

|
||||
|
||||
## Cache-Leistung
|
||||

|
||||
|
||||
### Beispiel Cache Leistung
|
||||

|
||||

|
||||
|
||||
## Multilevel Cache Organisation
|
||||

|
||||
- Level 1
|
||||
- Cache für Instruktionen und Daten
|
||||
- Level 2
|
||||
- vereint für Instruktionen und Daten
|
||||
- Level 3
|
||||
- auf Board-Ebene (Static RAM)
|
||||
|