2012-04-07 11 views
6

Angenommen, Kern A ändert eine Variable X und Kern B liest diese Variable (X). Natürlich wird in diesem Fall ein Cache-Kohärenz-Protokoll den Cache von Core B aktualisieren, da X durch Core A modifiziert wurde und natürlich wird diese Cache-Kohärenz die Ausführung auf Core B verlangsamen. Jedoch wird diese Cache-Kohärenz auch die Leistung von Core A beeinflussen. Angenommen, die Variable X befindet sich in ihrem Cache.Wie sich Cachekohärenz auf die Leistung in diesem Fall auswirkt

Antwort

3

Ja. Es gibt verschiedene Möglichkeiten, die Leistung zu beeinflussen. Das Standardprotokoll, das Leute verwenden, ist eine Variante von MSI (Modified, Shared, Invalid), manchmal mit O (Owner) und oft E (Exclusive), das dem Protokoll hinzugefügt wird. In Ihrem Beispiel würde Core A im Status Modified (oder Exclusive) beginnen, und Core Read würde Core A zwingen, ihn in Shared State zu ändern. Diese Aktion nimmt Zyklen im Cache auf, da es nur so viele Operationen gibt, die der Kern zu einem bestimmten Zeitpunkt ausführen kann. Der Einfluss auf Core A ist jedoch nicht sehr hoch, da es sich nicht im kritischen Pfad befindet. Der größere Einfluss ist, wenn Core A erneut schreibt. Da die Cache-Zeile im freigegebenen (oder ungültigen) Zustand ist, muss sie eine Anforderung zum Upgrade auf M oder E ausgeben. Diese Anforderung muss in den Core B gehen. Diese Operation befindet sich auf dem kritischen Pfad und der Schreibvorgang kann erst beendet werden Der Cache-Block wird aktualisiert. Das heißt, Schreibvorgänge werden im Allgemeinen gepuffert und der Prozessor wird bei dieser Operation im Allgemeinen nicht blockiert.

+0

In meinem Fall schreibt Core A häufig, und Core B liest manchmal häufig, also denke ich, dass es die Leistung ziemlich verletzen wird. Recht? – pythonic

+2

Wenn das meiste von dem, was Core a tut, Schreiben ist und das meiste, was Core b macht, lesen ist, dann kann es zu Problemen kommen. Dies wird allgemein als Ping-Pong bezeichnet. Welche Art von Kommunikation versuchen Sie zu tun? Es gibt Tonnen von Papieren zu diesem Thema. Wenn Sie beispielsweise etwas auf Core A produzieren und es auf Core B verwenden möchten, sollten Sie eine cachefähige, blocklose Warteschlangen-Datenstruktur verwenden, die so wenig Ping-Pong wie möglich vermeidet. (Es sollte Konzepte wie Schatten Kopf und Schatten Schwanz haben.) –

+0

Nathan, danke für solch einen informativen Kommentar. Ich werde dieses Pingpong-Denken genauer untersuchen. – pythonic

2

Ja, auf heutigen Mikroarchitekturen, die ME (O) SI-Kohärenzprotokolle verwenden, wird es A's Aktualisierungen auf X verlangsamen. Der Grund dafür ist, dass das Lesen von B die Cache-Zeile, die X enthält, vor dem Kopieren in den 'gemeinsam genutzten' Zustand versetzt, und dann muss die Schreiboperation von A die Kopie von B für ungültig erklären, bevor sie erneut geändert werden kann.

Das alles gesagt, A's schreibt zu X möglicherweise nicht wirklich die Ausführung Pipeline A. Dies hängt vom Speicherkonsistenzmodell der Architektur und Programmiersprache ab und davon, ob der Schreibvorgang als atomare Operation oder als nachfolgender Schreibzaun erzwungen wird.

Verwandte Themen