Meine Frage ist, wie schnell der Zugriff auf atomare Variablen in C ++ ist, indem ich das C ++ 0x ac- tomic & lt; & gt; Klasse? Was auf der Cache-Ebene passiert. Sagen wir, wenn ein Thread gerade liest, müsste er in den RAM gehen oder er könnte nur aus dem Cache des Kerns lesen, in dem er ausgeführt wird? Angenommen, die Architektur ist x86.
Ich bin besonders daran interessiert zu wissen, ob ein Thread gerade daraus liest, während kein anderer Thread zu dieser Zeit schreibt, wäre die Strafe die gleiche wie beim Lesen einer normalen Variablen. Wie auf atomare Variablen zugegriffen wird. Beinhaltet jede gelesene Implizitität auch ein Schreiben, wie beim Vergleich und Tausch? Werden atomare Variablen mithilfe von compare-and-swap implementiert?
Die Antwort ist nicht so einfach, wie Sie vielleicht erwarten. Es hängt vom genauen CPU-Modell ab und hängt auch von den Umständen ab. Der schlimmste Fall ist, wenn Sie eine Lese-, Modifizierungs- und Schreiboperation für eine Variable durchführen müssen und ein Konflikt vorliegt (was genau ist ein Konflikt ist wieder vom CPU-Modell abhängig, aber meistens wenn eine andere CPU auf die gleiche Cache-Zeile zugreift) .
Siehe auch Leistungsspezifikationen für .NET- oder Windows-Synchronisations-Stammdaten
Wenn Sie rohe Zahlen verwenden möchten, sollten Anger Fogs Datenlisten aus seinen Optimierungshandbüchern nützlich sein, auch intel handbooks haben ein paar Abschnitte, die die Latenzen für das Lesen von Speicher detailliert / schreibt auf Multicore-Systemen, die Details zu den Verlangsamungen enthalten sollten, die durch Bus-Sperren verursacht werden, die für atomare Schreibvorgänge benötigt werden.
Atomics verwenden eine spezielle Architekturunterstützung, um Atomarität zu erhalten, ohne dass alle Lese- / Schreibvorgänge bis zum Hauptspeicher gehen müssen. Grundsätzlich ist es jedem Kern gestattet, die Caches anderer Kerne zu untersuchen, so dass sie auf diese Weise das Ergebnis der Operationen anderer Threads herausfinden.
Die genaue Leistung hängt von der Architektur ab. Auf x86 waren viele Operationen bereits atomar, also frei. Ich habe Zahlen irgendwo von 10 bis 100 Zyklen gesehen, abhängig von der Architektur und dem Betrieb. Für die Perspektive ist jedes Lesen aus dem Hauptspeicher 3000-4000 Zyklen, also sind die Atomics alles viel schneller als direkt in den Speicher auf fast allen Plattformen zu gehen.