Cache-Kohärenz (englisch Cache Coherence) regelt in Mehrkern-Prozessoren, dass alle Kerne für dieselbe Speicheradresse denselben Wert sehen. Jeder Kern besitzt eigene Caches; schreibt ein Kern, halten die anderen Caches noch Kopien des alten Werts. Ohne Kohärenzprotokoll würden Programme unterschiedliche Datenstände beobachten.
Das MESI-Protokoll
Die klassische Lösung ist ein Zustandsmodell pro Cache-Linie. Das bekannteste Protokoll ist MESI mit vier Zuständen:
- Modified: Die Linie ist exklusiv in diesem Cache, der Wert weicht vom Hauptspeicher ab und muss spätestens beim Verdrängen zurückgeschrieben werden.
- Exclusive: Die Linie ist exklusiv vorhanden, der Wert entspricht dem Hauptspeicher.
- Shared: Mehrere Caches halten Kopien der Linie, alle Werte sind konsistent.
- Invalid: Die Linie ist ungültig, ein Zugriff löst einen Cache-Miss aus.
MOESI ergänzt den Zustand Owned: Ein Cache darf eine veränderte Linie teilen, ohne sie sofort in den Hauptspeicher zu schreiben. AMD-Zen- und viele ARM-Prozessoren verwenden Varianten dieses Schemas, Intel nutzt MESIF mit einem Forward-Zustand.
Snooping und Directory
Zwei Grundarchitekturen koordinieren die Zustände:
- Snooping: Alle Caches hängen an einem geteilten Bus und beobachten jede Transaktion. Einfach und schnell für wenige Kerne, aber der Bus wird zum Engpass, je mehr Kerne teilnehmen.
- Directory-basiert: Ein zentrales Verzeichnis merkt sich pro Cache-Linie, welche Caches eine Kopie halten. Skaliert besser für viele Kerne und ist die Basis moderner Server- und Desktop-Prozessoren (Ring- und Mesh-Interconnects).
Wird geschrieben, werden andere Kopien invalidiert, nicht aktualisiert. Der Schreibkern kann dadurch im laufenden Betrieb seine exklusive Linie erhalten.
False Sharing
Auch wenn zwei Kerne nur verschiedene Variablen derselben Cache-Linie verändern, invalidieren sie sich gegenseitig ständig, weil die Kohärenz auf Linien-Granularität arbeitet. Dieses False Sharing kann parallele Programme drastisch verlangsamen. Abhilfe: Variablen durch Padding ausrichten oder bewusst auf verschiedene Linien legen, damit jeder Kern seine eigene Linie besitzt.
Die Kohärenz ist Teil der Mikroarchitektur und für Software transparent. Die Daten-Caches stehen hinter der Register-Bank in der Speicherhierarchie; die Adressübersetzung übernimmt der TLB, der nichts mit Kohärenz zu tun hat. Der Invalidierungsverkehr durch Snoops erzeugt ähnliche Verzögerungen wie die Pipeline-Hazards in der CPU-Ausführung.
Verwandte Grundlagen: CPU, Superskalar (parallel arbeitende Kerne und Einheiten), Kernel (Verwaltung des geteilten Speichers).