Was ist mit einem expliziten Speicherzaun gemeint?
quelle
Um die Leistung zu verbessern, führen moderne CPUs häufig Befehle in der falschen Reihenfolge aus, um das verfügbare Silizium (einschließlich Lese- / Schreibvorgänge im Speicher) maximal zu nutzen. Da die Hardware die Integrität von Anweisungen erzwingt, bemerken Sie dies nie in einem einzelnen Ausführungsthread. Für mehrere Threads oder Umgebungen mit flüchtigem Speicher (z. B. speicherabgebildete E / A) kann dies jedoch zu unvorhersehbarem Verhalten führen.
Ein Speicherzaun / eine Speicherbarriere ist eine Klasse von Anweisungen, die bedeuten, dass Speicherlesevorgänge in der von Ihnen erwarteten Reihenfolge erfolgen. Zum Beispiel bedeutet ein "vollständiger Zaun", dass alle Lese- / Schreibvorgänge vor dem Zaun vor denen nach dem Zaun ausgeführt werden.
Beachten Sie, dass Speicherzäune ein Hardwarekonzept sind. In höheren Sprachen sind wir es gewohnt, mit Mutexen und Semaphoren umzugehen - diese können durchaus mithilfe von Speicherzäunen auf niedriger Ebene implementiert werden, und die explizite Verwendung von Speicherbarrieren ist nicht erforderlich. Die Verwendung von Speicherbarrieren erfordert ein sorgfältiges Studium der Hardwarearchitektur und ist in Gerätetreibern häufiger anzutreffen als Anwendungscode.
Die CPU-Neuordnung unterscheidet sich von Compiler-Optimierungen - obwohl die Artefakte ähnlich sein können. Sie müssen separate Maßnahmen ergreifen, um zu verhindern, dass der Compiler Ihre Anweisungen neu anordnet, wenn dies zu unerwünschtem Verhalten führen kann (z. B. Verwendung des flüchtigen Schlüsselworts in C).
Kopieren meiner Antwort auf eine andere Frage: Welche Tricks macht ein Prozessor, um Code zu optimieren? ::
quelle
Alpha is known for being the weakest
, warumweakest
? Ist es nicht besser, dass es mehr nachbestellt, so dass es viel schneller ausgeführt wird? (Ich bin kein Alpha-Benutzer, sondern frage nach dem Effekt vonvery reordering
vsrestricted reordering
). Was sind die Nachteile der Neuordnung von Chargen (mit Ausnahme des Risikos eines undefinierten Verhaltens, aber ich denke, die meisten modernen CPUs hätten eine gute Neuordnung auflösen und nur eine definierte Neuordnung implementieren müssen, da dies sonst keinen Sinn für die von ihnen getroffene Entscheidung ergibt).Nach meiner Erfahrung bezieht es sich auf eine Speicherbarriere , bei der es sich um eine (explizite oder implizite) Anweisung handelt, den Speicherzugriff zwischen mehreren Threads zu synchronisieren.
Das Problem tritt in der Kombination von modernen aggressiven Compilern (sie haben erstaunliche Freiheit, Anweisungen neu zu ordnen, wissen aber normalerweise nichts über Ihre Threads) und modernen Multicore-CPUs auf.
Eine gute Einführung in das Problem ist die Erklärung " Die doppelt überprüfte Sperre ist defekt ". Für viele war es der Weckruf, dass es Drachen gibt.
Implizite vollständige Speicherbarrieren sind normalerweise in Routinen zur Synchronisierung von Plattformthreads enthalten, die den Kern davon abdecken. Für die sperrenfreie Programmierung und Implementierung benutzerdefinierter, leichter Synchronisationsmuster benötigen Sie jedoch häufig nur die Barriere oder sogar nur eine Einwegbarriere.
quelle
Wikipedia weiß alles ...
quelle