2012-06-27 17 views
11

Gibt es C- oder C++ - Compiler, die ein "aggressives" Speicherkonsistenzmodell für volatile Variablen implementieren? Mit "aggressivem" Konsistenzmodell meine ich, dass alle Schreibvorgänge mit volatile Variablen mit Speicherbarrieren im generierten Code einhergehen.C- und C++ - Compiler mit "aggressiver" flüchtiger Semantik

AFAIK, das ist das übliche Verhalten für C oder C++ - Compiler auf IA64 (Itanium) -Plattform. Was ist mit x86? Gibt es einen Compiler, der den Itanium-ähnlichen Ansatz zur Verarbeitung von volatile Variablen auf der x86-Plattform implementiert (oder konfiguriert werden kann)?

Edit: ich VS 2005 Blick auf den Code erzeugt (nach dem Lesen der Kommentare) und ich sehe nichts, dass jede Art von Speicherbarriere ähneln würde, wenn volatile Variablen zugreifen. Dies ist vollkommen in Ordnung, um aufgrund der MESIF (Intel) - und MOESI (AMD) -Cache-Protokolle die Speicherkonsistenz auf einer Single-CPU-Multi-Core-x86-Plattform sicherzustellen.

Dies scheint jedoch auf einer Multi-CPU SMP x86-Plattform nicht ausreichend zu sein. Eine SMP-Plattform würde Speicherbarrieren in dem erzeugten Code erfordern, um die Speicherkonsistenz zwischen den CPUs sicherzustellen. Was vermisse ich? Was genau bedeutet Microsoft, wenn sie behaupten, dass sie bereits eine Semantik zum Akquirieren/Freigeben unter volatile Variablen haben?

+3

[Laut Raymond Chen] (https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true) erhalten Sie dieses Verhalten mit VS2005 und neuer – Praetorian

+2

@ Prætorian: [Laut offizieller Dokumentation] (http://msdn.microsoft.com/en-us/library/12a04hfd.aspx). ; -] – ildjarn

+0

@AndreyT: Testen Sie VC++ 2005 oder VC++ 2005 SP1? IIRC, VC++ 2005 RTM hatte einen Fehler, bei dem 'volatile' nicht die erwartete Semantik hatte, die in SP1 und VC++ 2008+ behoben wurde. – ildjarn

Antwort

2

Es sollte beachtet werden, dass x86-CPUs weder Lasten mit anderen Lasten neu ordnen noch mit anderen Speichern speichern. Daher sind keine expliziten Barrieren erforderlich. Der MSVC-Compiler stellt sicher, dass Lasten nicht mit flüchtigen Lasten neu geordnet werden und Speicher nicht mit flüchtigen Speichern neu geordnet werden (ich spreche jetzt über die Neuanordnung von Lade- und Speicheranweisungen), wodurch die Semantik für flüchtige Speicherereignisse gewährleistet und freigegeben wird lädt und speichert jeweils.

+0

Gilt das auch für Multi-CPU-Gehäuse (im Gegensatz zu Single-CPU-Multi-Core-Gehäuse)? – AnT

+0

@AndreyT, die Reihenfolge, in der der externe Bus die Lasten sieht, ist die gleiche wie die Reihenfolge der Ladeanweisungen. Das Gleiche gilt für Geschäfte. Wie Sie bereits angemerkt haben, sorgen Cache-Protokolle für Kohärenz. Mit anderen Worten, wenn CPU1 einen Speicher S ausführt und CPU2 diesen Speicher mit seiner Ladung L sieht, dann werden Ladevorgänge durch CPU2 nach L alle Speichervorgänge durch CPU1 vor S sehen. Und das, mein Freund, ist Semantik zum Erwerb/Freigabe :) – avakar

+0

@AndreyT, ich meine nicht zu schimpfen, aber ich wünschte, das C++ - Komitee hätte den "Volatile Acquires/Release Semantics" -Garantie-Standard gemacht, anstatt mit "" zu kommen. – avakar