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
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.
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.
- 1. Format der Markierung, die sich auf die Anzeige auswirkt
- 2. Wie Schleife die Abfrage in diesem Fall?
- 3. Warnt CS3006 in diesem Fall?
- 4. Warum hat sich Haskells Faulheit auf die Leistung ausgewirkt?
- 5. Wie ein Tabellenfilter in diesem Fall schreiben
- 6. Wie array.foo in diesem Fall zu verstehen?
- 7. Wie kann benutzerdefinierte Pseudoklasse hinzugefügt werden, was sich auf die gesamte Zeile in TableView auswirkt?
- 8. Wie Metaklasse (__call__) in diesem Fall funktioniert?
- 9. Was bedeutet "&" in diesem Fall?
- 10. Wie die ausgewählte Tabelle tr Zeile in diesem Fall holen
- 11. Wie wird die prototypische Vererbung in diesem Fall durchgeführt?
- 12. Wie verwende ich die Break-Klausel in diesem speziellen Fall
- 13. Wie vermeidet man die Duplizierung von Code in diesem Fall?
- 14. Ein href, der sich darauf auswirkt, wie Bilder angezeigt werden
- 15. Inline-Blockelement, nicht inline in diesem Fall
- 16. Welcher Optimierungstyp ist in diesem Fall?
- 17. Ist noda-time in diesem Fall anwendbar?
- 18. Wie aktualisieren sich die Punkte auf diesem Sportticker ohne Ajaxaufrufe?
- 19. Warum ändert die Sortierung das Original in diesem Fall?
- 20. Wie wirken sich ADO.NET DataTable-Einschränkungen auf die Leistung aus?
- 21. CDN ja oder nein in diesem Fall
- 22. Was macht Perl mit diesem Argument in diesem Fall?
- 23. Warum Datenbankverbindungen sind in diesem Fall geschlossen
- 24. Warum ist die Timeout-Variable in diesem Fall gemeinsam nutzbar?
- 25. In diesem Fall die Google Play-Entwicklerrichtlinie durchbrechen oder nicht?
- 26. Warum wählt der Compiler in diesem Fall die falsche Funktionsüberladung?
- 27. Python: Ist in diesem Fall isinstance() notwendig?
- 28. Welchen Vorteil hat die Verwendung von Methodenreferenzen in diesem Fall?
- 29. Usefulness von @property in diesem Fall
- 30. Wie man Text wie Logo in diesem Fall bildet?
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
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.) –
Nathan, danke für solch einen informativen Kommentar. Ich werde dieses Pingpong-Denken genauer untersuchen. – pythonic