Wann wird der CPU-Cache in den Hauptspeicher zurückgespült?

2807
CarmeloS

Wenn ich eine CPU mit zwei Kernen habe, hat jeder Kern einen eigenen L1-Cache. Ist es möglich, dass Core1 und Core2 denselben Speicherbereich gleichzeitig zwischenspeichern?
Wenn es möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?

18

3 Antworten auf die Frage

26
David Schwartz

Wenn ich eine CPU mit zwei Kernen habe, hat jeder Kern einen eigenen L1-Cache. Ist es möglich, dass Core1 und Core2 denselben Speicherbereich gleichzeitig zwischenspeichern?

Ja. Leistung wäre schrecklich, wenn dies nicht der Fall wäre. Betrachten Sie zwei Threads, die denselben Code ausführen. Sie möchten diesen Code in beiden L1-Caches.

Wenn es möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?

Der alte Wert befindet sich im Hauptspeicher, was keine Rolle spielt, da keine CPU ihn lesen wird. Vor dem Auswerfen eines geänderten Werts aus dem Cache muss dieser in den Speicher geschrieben werden. Typischerweise wird eine Variante des MESI-Protokolls verwendet. Wenn in der traditionellen Implementierung von MESI ein Wert in einem Cache geändert wird, kann er in keinem anderen Cache auf derselben Ebene vorhanden sein.

15
sleske

Ja, dies kann passieren (wenn zwei Caches den gleichen Speicherbereich zwischenspeichern), dies ist tatsächlich ein Problem, das in der Praxis häufig auftritt. Es gibt verschiedene Lösungen, zum Beispiel:

  • Die beiden Caches können miteinander kommunizieren, um sicherzustellen, dass sie nicht zustimmen
  • Sie können eine Art Supervisor haben, der alle Caches überwacht und sie entsprechend aktualisiert
  • Jeder Prozessor überwacht die zwischengespeicherten Speicherbereiche, und wenn er einen Schreibvorgang erkennt, wirft er seinen (jetzt ungültigen) Cache aus

Das Problem wird als Cache-Kohärenz bezeichnet . Der Wikipedia-Artikel zum Thema bietet einen schönen Überblick über das Problem und mögliche Lösungen.

2
Kimberly W

Um die Frage in Ihrem Titel zu beantworten, hängt es vom Caching-Protokoll ab. Wenn es sich um ein Zurückschreiben handelt, wird der Cache nur in den Hauptspeicher zurückgespült, wenn der Cache-Controller keine andere Wahl hat, als einen neuen Cache-Block in den bereits belegten Speicherplatz zu setzen. Der Block, der zuvor den Platz belegt hat, wird entfernt und sein Wert wird in den Hauptspeicher zurückgeschrieben.

Das andere Protokoll ist Durchschreiben. In diesem Fall wird der entsprechende Block auf Ebene (n + 1) jedes Mal aktualisiert, wenn der Cache-Block auf Level n geschrieben wird. (Das Konzept ähnelt in etwa dem Ausfüllen eines Formulars mit Kohlepapier darunter; alles, was Sie darüber schreiben, wird auf das Blatt unten kopiert.) Dies ist langsamer, da offensichtlich mehr Schreibvorgänge erforderlich sind, die Werte zwischen den Caches jedoch einheitlicher sind. In dem Rückschreibschema würde nur der Cache auf der höchsten Ebene den aktuellsten Wert für einen bestimmten Speicherblock haben.

Ich frage mich, wie viel Prozent der Leser hier jemals Kohlepapier verwendet haben. :) Barmar vor 9 Jahren 1