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

18

Wenn ich eine CPU mit zwei Kernen habe, hat jeder Kern seinen eigenen L1-Cache. Ist es möglich, dass Core1 und Core2 gleichzeitig denselben Teil des Speichers zwischenspeichern?
Wenn es möglich ist, wie hoch ist der Wert des Hauptspeichers, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?

CarmeloS
quelle

Antworten:

26

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

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

Wenn es möglich ist, wie hoch ist der Wert des Hauptspeichers, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?

Der alte Wert wird im Hauptspeicher gespeichert, was keine Rolle spielt, da weder die CPU ihn lesen wird. Bevor ein geänderter Wert aus dem Cache entfernt werden kann, muss er in den Speicher geschrieben werden. Typischerweise wird eine Variante des MESI-Protokolls verwendet. Wenn in der herkömmlichen Implementierung von MESI ein Wert in einem Cache geändert wird, kann er auf derselben Ebene in keinem anderen Cache vorhanden sein.

David Schwartz
quelle
15

Ja, dies kann passieren (wenn zwei Caches denselben Speicherbereich zwischenspeichern). Tatsächlich ist es 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 widersprechen
  • Sie können eine Art Supervisor haben, der alle Caches überwacht und sie entsprechend aktualisiert
  • Jeder Prozessor überwacht die zwischengespeicherten Speicherbereiche und löscht den (jetzt ungültigen) Cache, wenn er einen Schreibvorgang erkennt

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

sleske
quelle
2

Die Beantwortung der Frage in Ihrem Titel hängt davon ab, welches Caching-Protokoll verwendet wird. Wenn es sich um ein Zurückschreiben handelt, wird der Cache nur dann in den Hauptspeicher zurückgespült, wenn der Cache-Controller keine andere Wahl hat, als einen neuen Cache-Block in den bereits belegten Speicher zu stellen. Der Block, der zuvor den Platz belegt hatte, wird entfernt und sein Wert in den Hauptspeicher zurückgeschrieben.

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

Kimberly W
quelle
1
Ich frage mich, wie viel Prozent der Leser hier jemals Kohlepapier verwendet haben. :)
Barmar