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.

MerkmalWrite-AllocateNo-Write-Allocate
Bei einem Write-MissLiest die ganze Zeile aus der unteren Ebene, legt sie im Cache ab und schreibt dann hineinLä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 ausNicht nötig; nur die geschriebenen Daten gehen an die untere Ebene
Übliche KombinationWrite-Back: spätere Schreibzugriffe auf die geholte Zeile treffen und werden ohne Speicherverkehr aufgefangen, was die Kosten des ersten Lesens wieder einspieltWrite-Through: jeder Schreibzugriff geht ohnehin an die untere Ebene, daher würde das Holen der Zeile den Schreibverkehr nicht verringern
Datenverkehr zur unteren EbeneGeringer, wenn dieselbe Zeile oft beschrieben wird oder die geschriebenen Daten wieder gelesen werdenJeder 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 CacheKeine Lesezugriffe und keine Cache-Verschmutzung, daher für solche Daten geeignet
Lesen direkt nach dem SchreibenDie Zeile liegt im Cache, der Lesezugriff trifftDie Zeile liegt nicht im Cache, der Lesezugriff verfehlt und holt sie
ImplementierungstechnikenFü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 lesenEin 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.

Wann welche Variante?

Write-Allocate
Wenn geschriebene Daten bald wieder gelesen oder beschrieben werden, etwa in einer Schleife, die Array-Elemente aktualisiert: Schreibzugriffe mit zeitlicher Lokalität.
No-Write-Allocate
Wenn große Datenmengen geschrieben werden, die eine Weile nicht wieder gelesen werden. Vermeidet nutzlose Lesezugriffe und hält den Cache für nützliche Daten frei.
In der Software
Auch bei einem Write-Allocate-Cache vermeiden Non-temporal-Stores das Lesen der Zeilen bei großen reinen Schreibpuffern. Die geschriebenen Daten bleiben dann aber nicht im Cache, sodass ein sofortiges Zurücklesen langsamer ist.

Häufige Fragen

Was ist der Unterschied zwischen Write-Allocate und No-Write-Allocate?

Bei einem Write-Miss lädt Write-Allocate die Zeile in den Cache und schreibt dann im Cache. No-Write-Allocate lädt die Zeile nicht und schreibt direkt in die untere Ebene.

Verwendet Write-Through immer No-Write-Allocate?

Nicht immer. Wie ein treffender Schreibzugriff weitergegeben wird (Write-Back oder Write-Through) und ob bei einem Miss eine Zeile geholt wird, sind getrennte Entscheidungen. In der Praxis wird Write-Through aber meist mit No-Write-Allocate und Write-Back mit Write-Allocate kombiniert. In einem Write-Through-Cache aktualisiert ein treffender Store die Kopie im Cache und wird zusätzlich in die untere Ebene geschrieben; ein verfehlender Store geht normalerweise direkt nach unten, ohne die Zeile zu holen.

Warum ist Write-Allocate bei reinen Schreibdaten langsam?

Weil jede Zeile, die ohnehin nur überschrieben wird, zuerst aus dem Hauptspeicher gelesen wird. Dieses Lesen plus das spätere Zurückschreiben verdoppelt den Verkehr etwa und verdrängt zudem andere Daten, die wiederverwendet würden. Non-temporal-Stores vermeiden dieses Lesen.

Verständnis prüfen

Welches Verfahren schreibt bei einem Cache-Miss beim Schreiben direkt in die untere Hierarchieebene, ohne die Zeile zu laden?

  1. AWrite-Allocate
  2. BWrite-Back
  3. CNo-Write-Allocate
Antwort und Erläuterung anzeigen

Antwort: C. No-Write-Allocate

Das Verfahren, bei einem Schreib-Miss direkt in die untere Ebene zu schreiben, ohne die Zeile zu laden, ist No-Write-Allocate und wird häufig mit Write-Through kombiniert. Bei Daten, die nach dem Schreiben nicht wieder gelesen werden, spart es unnötiges Laden. Write-Allocate lädt dagegen die Zeile vor dem Schreiben, ist vorteilhaft, wenn geschriebene Daten bald wieder verwendet werden, und wird häufig mit Write-Back kombiniert. Write-Back legt die Behandlung von Schreibtreffern fest und ist eine andere Achse als die Frage, ob bei einem Miss geladen wird.

Was ist der Hauptvorteil von Stores, die den Cache umgehen (Non-Temporal Stores), wenn große Datenmengen geschrieben werden, die danach vorerst nicht wieder gelesen werden?

  1. ADie geschriebenen Daten bleiben lange im Cache und werden beim späteren Lesen schneller
  2. BDer Cache wird nicht mit Daten gefüllt, die nicht wiederverwendet werden
  3. CDie Schreibreihenfolge wird nicht mehr garantiert, sodass sich Programmfehler leichter finden lassen
Antwort und Erläuterung anzeigen

Antwort: B. Der Cache wird nicht mit Daten gefüllt, die nicht wiederverwendet werden

Bei gewöhnlichen Schreibzugriffen wird per Write-Allocate die Zeile erst aus dem Hauptspeicher geladen und dann beschrieben; selbst bei Daten, die nur geschrieben werden, entsteht daher Ladeverkehr, und andere Daten, die wiederverwendet würden, werden verdrängt. Non-Temporal Stores senden Schreibzugriffe gebündelt direkt an den Hauptspeicher, verschmutzen den Cache nicht und sparen unnötiges Laden. Geschriebene Daten bleiben nicht im Cache, sodass es bei sofortigem Zurücklesen eher langsamer wird. Dass sich der Umgang mit der Reihenfolge ändert, ist ein Nebeneffekt und kein Vorteil.

Was ist der Hauptgrund, weshalb Write-Back bei einer Verarbeitung, die wiederholt in dieselbe Zeile schreibt, gegenüber Write-Through vorteilhaft ist?

  1. AWeil das Schreiben im Cache erledigt wird und beim Verdrängen nur einmal in den Hauptspeicher geschrieben werden muss
  2. BWeil mit jedem Schreibzugriff auch der Hauptspeicher aktuell ist und beim Verdrängen keine Verarbeitung nötig ist
  3. CWeil Cache und Hauptspeicher stets übereinstimmen und keine Kohärenzverwaltung nötig ist
Antwort und Erläuterung anzeigen

Antwort: A. Weil das Schreiben im Cache erledigt wird und beim Verdrängen nur einmal in den Hauptspeicher geschrieben werden muss

Bei Write-Back werden wiederholte Schreibzugriffe auf dieselbe Zeile allein im Cache abgewickelt, und beim Verdrängen wird die dirty-Zeile nur einmal zurückgeschrieben. Der Verkehr zum Hauptspeicher und der Stromverbrauch lassen sich dadurch stark senken. Bei jedem Schreibzugriff auch den Hauptspeicher zu aktualisieren ist eine Eigenschaft von Write-Through, bei dem bei wiederholtem Schreiben in dieselbe Zeile jedes Mal Verkehr entsteht. Auch die ständige Übereinstimmung von Cache und Hauptspeicher ist eine Eigenschaft von Write-Through; bei Write-Back gibt es Zeiträume ohne Übereinstimmung.

  1. Welche Aussage zum Write-Back-Verfahren bei den Schreibstrategien des Caches ist richtig?
  2. Was ist der Hauptzweck eines Schreibpuffers bei einem Write-Through-Cache?
  3. Welche Rolle spielt das Dirty-Bit, das bei einem Write-Back-Cache an jede Zeile angefügt wird?

Übungsfragen zu Speicherhierarchie und Leistung

Wichtige Begriffe erklärt

Write-Allocate
Verfahren, bei dem bei einem Schreib-Cache-Miss die Zeile zuerst in den Cache geladen und dann beschrieben wird. Meist mit Write-Back kombiniert. Das direkte Schreiben in die untere Ebene ohne Laden heißt No-Write-Allocate.
Write-Through
Verfahren, bei dem beim Schreiben in den Cache gleichzeitig auch in die darunterliegende Ebene (z. B. den Hauptspeicher) geschrieben wird. Die untere Ebene ist stets aktuell, aber der Schreibverkehr ist hoch; daher wird es mit einem Schreibpuffer kombiniert.
Cache-Zeile (Cache Line)
Einheit, in der Daten zwischen Cache und der darunterliegenden Hierarchieebene gelesen und geschrieben werden. Auch Cache-Block genannt. Bei vielen CPUs 64 Byte; die niederwertigen Adressbits geben die Position (Offset) in der Zeile an.
Cache-Speicher
Schneller, kleiner Speicher in der Nähe der CPU. Er hält häufig benötigte Daten und überbrückt den Geschwindigkeitsunterschied zum Hauptspeicher. Er besteht überwiegend aus SRAM.
Zeitliche Lokalität
Eigenschaft, dass auf einmal zugegriffene Daten oder Befehle bald wieder zugegriffen wird. Beispiel sind in Schleifen wiederholt genutzte Variablen; einer der Gründe, warum Caches wirken.
Cache-Kohärenz
Mechanismus in Mehrkern-CPUs, der die Konsistenz sicherstellt, wenn mehrere Kerne Daten derselben Adresse in ihren Caches halten. Schreibt ein Kern, werden z. B. die veralteten Kopien in anderen Kernen für ungültig erklärt.

Verwandte Vergleiche