Write-Allocate vs. No-Write-Allocate: Write-Miss, Datenverkehr und Kombination
Write-Allocate und No-Write-Allocate sind Strategien, die festlegen, ob bei einem Schreibfehlzugriff (Write-Miss) eine Zeile in den Cache geholt wird. Bei Write-Allocate liest der Cache die Zeile zuerst aus der darunterliegenden Ebene und führt den Schreibzugriff dann im Cache aus. Bei No-Write-Allocate wird die Zeile nicht geholt, und der Schreibzugriff geht direkt an die darunterliegende Ebene. Das ist eine andere Entscheidung als Write-Back vs. Write-Through, die festlegt, wann ein treffender Schreibzugriff die untere Ebene erreicht; meist wird Write-Allocate aber mit Write-Back und No-Write-Allocate mit Write-Through kombiniert.
| Merkmal | Write-Allocate | No-Write-Allocate |
|---|---|---|
| Bei einem Write-Miss | Liest die ganze Zeile aus der unteren Ebene, legt sie im Cache ab und schreibt dann hinein | Lässt den Cache unverändert und sendet den Schreibzugriff direkt an die untere Ebene |
| Nachladen der Zeile (Lesen) | Erforderlich. Auf Mehrkernsystemen ist es ein Read for Ownership (RFO), das vor dem Schreiben die Kopien anderer Kerne invalidiert; ein Store-Miss sieht auf dem Speicherbus daher wie ein Lesezugriff aus | Nicht nötig; nur die geschriebenen Daten gehen an die untere Ebene |
| Übliche Kombination | Write-Back: spätere Schreibzugriffe auf die geholte Zeile treffen und werden ohne Speicherverkehr aufgefangen, was die Kosten des ersten Lesens wieder einspielt | Write-Through: jeder Schreibzugriff geht ohnehin an die untere Ebene, daher würde das Holen der Zeile den Schreibverkehr nicht verringern |
| Datenverkehr zur unteren Ebene | Geringer, wenn dieselbe Zeile oft beschrieben wird oder die geschriebenen Daten wieder gelesen werden | Jeder fehlende Schreibzugriff geht jedes Mal hinaus, aber es entstehen keine zusätzlichen Lesezugriffe |
| Große reine Schreibdaten (Speicher löschen, Ausgabe schreiben) | Jede Zeile wird nur gelesen, um überschrieben und später zurückgeschrieben zu werden; das verdoppelt den Verkehr etwa und verdrängt nützliche Daten aus dem Cache | Keine Lesezugriffe und keine Cache-Verschmutzung, daher für solche Daten geeignet |
| Lesen direkt nach dem Schreiben | Die Zeile liegt im Cache, der Lesezugriff trifft | Die Zeile liegt nicht im Cache, der Lesezugriff verfehlt und holt sie |
| Implementierungstechniken | Für reine Schreibdaten umgehen Non-temporal-Stores (Streaming-Stores) den Cache und senden zusammengefasste Schreibzugriffe direkt an den Hauptspeicher; manche ISAs haben zudem einen Befehl, der eine ganze Zeile nullt, ohne ihren alten Inhalt zu lesen | Ein Schreibpuffer verbirgt die Schreiblatenz und fasst oft mehrere Schreibzugriffe auf dieselbe Zeile zu einer Übertragung zusammen |
| Einsatz | Üblich in Write-Back-Caches; die meisten CPU-Caches von L1 bis L3 sind Write-Back | Üblich in Write-Through-Caches, etwa einem kleinen L1 mit einem Write-Back-L2 dahinter oder in einfachen eingebetteten Prozessoren |
Die Zahlenwerte sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.