Wenn ich eine CPU mit zwei Kernen habe, hat jeder Kern seinen eigenen L1-Cache. Ist es dann möglich, dass Core1 und Core2 gleichzeitig denselben Teil des Speichers zwischenspeichern?
Wenn dies möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?
Antwort1
Wenn ich eine CPU mit zwei Kernen habe und jeder Kern seinen eigenen L1-Cache hat, 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 haben.
Wenn dies möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihren Wert im Cache bearbeitet haben?
Der alte Wert wird im Hauptspeicher sein, was aber keine Rolle spielt, da keine der CPUs ihn lesen wird. Bevor ein geänderter Wert aus dem Cache ausgeworfen wird, muss er in den Speicher geschrieben werden. Normalerweise wird eine Variante desMESI-Protokollwird verwendet. Wenn in der herkömmlichen MESI-Implementierung ein Wert in einem Cache geändert wird, kann er in keinem anderen Cache auf derselben Ebene vorhanden sein.
Antwort2
Ja, das (wenn zwei Caches denselben Speicherbereich zwischenspeichern) kann vorkommen. 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 kommunizieren, um sicherzustellen, dass sie sich nicht uneinig sind
- Sie können eine Art Supervisor haben, der alle Caches überwacht und entsprechend aktualisiert
- Jeder Prozessor überwacht die Speicherbereiche, die er zwischengespeichert hat, und wenn er einen Schreibvorgang erkennt, wirft er seinen (jetzt ungültigen) Cache aus
Das Problem heißtCache-Kohärenz. DerWikipedia-Artikel zum Themabietet einen guten Überblick über das Problem und mögliche Lösungen.
Antwort3
Um die Frage in Ihrem Titel zu beantworten: Es hängt davon ab, welches Caching-Protokoll verwendet wird. Wenn es sich um ein Writeback-Protokoll handelt, wird der Cache nur dann in den Hauptspeicher zurückgeschrieben, wenn der Cache-Controller keine andere Wahl hat, als einen neuen Cache-Block in bereits belegten Speicherplatz zu platzieren. Der Block, der zuvor den Speicherplatz belegte, wird entfernt und sein Wert wird in den Hauptspeicher zurückgeschrieben.
Das andere Protokoll ist Write-Through. 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; was Sie oben schreiben, wird auf das Blatt darunter kopiert.) Dies ist langsamer, da offensichtlich mehr Schreibvorgänge erforderlich sind, aber die Werte zwischen den Caches sind konsistenter. Beim Write-Back-Schema hätte nur der Cache auf der höchsten Ebene den aktuellsten Wert für einen bestimmten Speicherblock.