Wann Ist eine CPU-Cache Geleert, Wieder in den Hauptspeicher?

0
350

Wenn Sie gerade erst anfangen zu lernen, wie multi-core-CPUs, caching, cache-Kohärenz und Speicher arbeitet, es mag ein wenig verwirrend auf den ersten. Mit dem im Verstand, heute ist SuperUser-Q&A post hat Antworten auf neugierige Leser, auf die Frage.

Die heutige Frage & Antwort-Sitzung kommt zu uns mit freundlicher Genehmigung von SuperUser—eine Unterteilung von Stack Exchange, eine von der community getriebene Gruppierung der Q&A-Websites.

Die Frage

SuperUser-reader CarmeloS will wissen, wenn ein CPU-cache ist geleert, zurück zum Arbeitsspeicher:

Wenn ich eine CPU mit zwei Kerne und jeder Kern hat seinen eigenen L1-cache, ist es möglich, dass Core1 und Core2 beide cache die gleichen Teil des Speichers an der gleichen Zeit? Wenn es möglich ist, was wird der Wert des Hauptspeichers, wenn sowohl Core1 und Core2 bearbeitet haben, deren Werte im cache?

Wann ist eine CPU-cache geleert, wieder in den Hauptspeicher?

Die Antwort

SuperUser-Mitwirkende David Schwartz, sleske, und Kimberly W haben die Antwort für uns. Erstens, David Schwartz:

Wenn ich eine CPU mit zwei Kerne und jeder Kern hat seinen eigenen L1-cache, ist es möglich, dass Core1 und Core2 beide cache die gleichen Teil des Speichers an der gleichen Zeit?

Ja, die Leistung wäre schrecklich wenn dies nicht der Fall war. Betrachten wir zwei threads mit dem gleiche code. Sie möchten, dass code im L1-caches.

Wenn es möglich ist, was wird der Wert des Hauptspeichers, wenn sowohl Core1 und Core2 bearbeitet haben, deren Werte im cache?

Der alte Wert wird im Hauptspeicher, die nicht von Bedeutung, da weder auf Kern, es zu Lesen. Vor dem Auswerfen einer geänderten Wert aus dem cache, muss es in den Speicher geschrieben. In der Regel, einige Variante der MESI-Protokoll verwendet wird. In der traditionellen Umsetzung von MESI, wenn ein Wert geändert wird, in einem cache, den es gar nicht vorhanden sein kann, in jedem anderen cache auf die gleiche Ebene.

Gefolgt von der Antwort von sleske:

Ja, mit zwei caches, cache der gleiche Speicherbereich kann passieren und ist eigentlich ein problem, das Auftritt, eine Menge in der Praxis. Es gibt verschiedene Lösungen, zum Beispiel:

  • Die beiden caches miteinander kommunizieren können, um sicherzustellen, dass Sie nicht widersprechen
  • Sie können haben eine Art von Oberaufsicht, welche Monitore alle caches und aktualisiert Sie entsprechend
  • Jedem Prozessor überwacht die Speicher-Bereiche, die er zwischengespeichert hat, und, wenn es erkennt einen schreiben, es wirft seine (nun ungültige) cache

Das problem ist, man cache-Kohärenz und der Wikipedia-Artikel über das Thema hat einen schönen überblick über das problem und mögliche Lösungen.

Und unsere endgültige Antwort von Kimberly W:

Die Antwort auf die Frage in deinem post-Titel, es hängt davon ab, was die caching-Protokoll ist. Wenn Sie write-back-cache wird nur dann geleert werden, wieder in den Hauptspeicher, wenn der cache-controller hat keine Wahl, sondern um eine neue cache-block in bereits besetzten Raum. Der block, der vorher besetzten Raum entfernt wird und seinen Wert geschrieben wird, zurück in den Hauptspeicher.

Das andere Protokoll wird write-through. In diesem Fall, wenn der cache-block geschrieben, auf Ebene n, wird der entsprechende block auf der Ebene n+1 ist aktualisiert. Es ist im Konzept ähnlich wie das ausfüllen eines Formulars mit carbon-Papier unter, was auch immer Sie schreiben oben ist kopiert, die auf dem Blatt unten. Das ist langsamer, weil es offensichtlich geht es um mehr schreiben-Operationen, aber die Werte zwischen den caches sind mehr konsistent. In der write-back-Schema, nur das höchste level cache hätten die meisten up-to-date-Wert für einen bestimmten Speicherblock.

Etwas hinzufügen zu der Erklärung? Sound off in den Kommentaren. Wollen Sie mehr Lesen Sie Antworten von anderen tech-savvy-Stack Exchange-Benutzer? Schauen Sie sich die vollständige Diskussion thread hier.

Bild-Kredit: Lemsipmatt (Flickr)