Zuerst einige Kontext: Ich arbeite mit einem Pre-C11, Inline-Asm-basierten atomaren Modell, aber für die Zwecke dieser bin ich glücklich zu ignorieren der C-Aspekt (und alle Compiler-Barriere Probleme, die ich separat behandeln kann) und betrachten es im Wesentlichen nur eine asm/CPU-Architektur Frage.Ist es möglich, Speicherbarrieren nur auf der Speicherseite zu verwenden?
Angenommen, ich habe Code, der wie folgt aussieht:
various stores
barrier
store flag
barrier
Ich möchte in der Lage sein flag
von einem anderen CPU-Kern zu lesen und zu dem Schluss, dass die various stores
wurden bereits durchgeführt und sichtbar gemacht. Ist es möglich, dies zu tun ohne irgendeine Art von Speicher Barriere Anweisung auf der Ladeseite? Offensichtlich ist es zumindest bei einigen CPU-Architekturen möglich, zum Beispiel bei x86, wo eine explizite Speicherbarriere auf keinem der beiden Kerne benötigt wird. Aber wie sieht es überhaupt aus? Variiert es stark durch CPU-Bogen, ob dies möglich ist?
AFAIK, Alpha benötigt Barrieren, während ARM/PPC entweder Barrieren oder Adress-/Datenabhängigkeiten oder RW-Steuerabhängigkeiten oder RR-Steuerabhängigkeiten + ISYNC/ISB zwischen dem Lesen des Flags und der davon abhängigen Operation benötigt. Für ARM/PPC könnten Sie an "Einführung in die ARM und POWER Relaxed Memory Modelle" interessiert sein. – ninjalj
Ein weiterer Datenpunkt: Gemäß dem Vorschlag zur Speicherbelegung unter http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1444.htm können einige eingebettete MIPS-CPUs auch Barrieren vermeiden, indem sie Abhängigkeiten verwenden (ältere, "wahre" MIPS sind angeblich seq-cst). Da 'smp_read_barrier_depends()' im Linux-Kernel nur eine Barriere für Alpha ist, scheint es, dass, wenn es eine (möglicherweise falsche) Adressabhängigkeit auf der Leseseite gibt, die Lesebarriere vermieden werden kann (außer Alpha). Den Compiler zu veranlassen, die Abhängigkeit beizubehalten, ist ein ganz anderes Problem. – ninjalj