Frage

Nach Angaben des Intel 64- und IA-32-Architektur-Softwareentwicklerhandbuchs stellt das Sperrsignalpräfix "sicher, dass der Prozessor ausschließlich ein gemeinsamer Speicher verwendet wird, während das Signal geltend gemacht wird". Das kann eine in Form eines Bus- oder Cache -Schlosses sein.

Aber - und das ist der Grund, warum ich diese Frage stelle - es ist mir nicht klar, wenn dieses Präfix auch einen Speicherbarrier bietet.

Ich entwickle mich mit Nasm in einer Umgebung mit mehreren Prozessoren mit NASM und muss atomare Operationen mit optionaler Erwerbs- und/oder Freigabesemantik implementieren.

Muss ich also die Anweisungen von Mfence, Sfence und Lfence verwenden oder wäre dies überflüssig?

War es hilfreich?

Lösung

Nein, es besteht keine Notwendigkeit, Anweisungen zu verwenden MFENCE, SFENCE and LFENCE in Beziehung mit LOCK Präfix.

MFENCE, SFENCE and LFENCE Anweisungen garantieren Sichtbarkeit des Speichers in allen CPU -Kernen. Auf Beispiel die MOV Anweisung kann nicht mit verwendet werden LOCK Präfix: Um sicherzustellen, dass das Ergebnis des Speicherbewegens für alle CPU -Kerne sichtbar ist, müssen wir sicher sein, dass der CPU -Cache zum RAM gespült wird und dass wir mit Zaunanweisungen erreichen.

BEARBEITEN: Mehr über gesperrte Atomoperationen aus dem Intel -Handbuch:

Gesperrte atomare Operationen

Die 32-Bit-IA-32-Prozessoren unterstützen gesperrte Atomvorgänge an den Standorten im Systemspeicher. Diese Vorgänge werden in der Regel zur Verwaltung gemeinsamer Datenstrukturen (wie Semaphoren, Segmentdeskriptoren, Systemsegmente oder Seitentabellen) verwendet, in denen zwei oder mehr Prozessoren gleichzeitig versuchen können, dasselbe Feld oder Flagge zu ändern. Der Prozessor verwendet drei voneinander abhängige Mechanismen für die Durchführung von gesperrten atomaren Operationen:

• Garantierte atomare Operationen

• Busverriegelung mit dem Sperren# Signal und dem Sperranweisungspräfix

• Cache -Kohärenzprotokolle, die sicherstellen, dass Atomoperationen an zwischengespeicherten Datenstrukturen (Cache -Sperre) durchgeführt werden können; Dieser Mechanismus ist in den Prozessoren Pentium 4, Intel Xeon und P6 vorhanden

Diese Mechanismen sind auf folgende Weise voneinander abhängig. Bestimmte grundlegende Speichertransaktionen (z. B. Lesen oder Schreiben eines Byte im Systemspeicher) werden immer garantiert atomisch behandelt. Nach dem Start garantiert der Prozessor, dass der Betrieb abgeschlossen wird, bevor ein anderer Prozessor oder Busagent den Zugriff auf den Speicherort ermöglicht. Der Prozessor unterstützt auch die Bussperrung für die Durchführung ausgewählter Speichervorgänge (z. Da häufig verwendete Speicherorte häufig in den L1- oder L2 -Caches eines Prozessors zwischengespeichert werden, können Atomoperationen häufig in den Caches eines Prozessors durchgeführt werden, ohne das Busschloss zu behaupten. Hier versichern die Cache -Kohärenzprotokolle des Prozessors, dass andere Prozessoren, die die gleichen Speicherorte zwischengespeichert werden, ordnungsgemäß verwaltet werden, während Atomvorgänge an zwischengespeicherten Speicherorten durchgeführt werden.

Andere Tipps

Nein. Aus den IA32 -Handbüchern (Band 3a, Kapitel 8.2: Speicherbestellung):

Liest oder schriftlich kann nicht mit E/A -Anweisungen neu bestellt werden, gesperrte Anweisungen, oder Serialisierungsanweisungen.

Daher wird bei gesperrten Anweisungen keine Zaunanweisung benötigt.

Das Problem tritt immer noch auf, wenn Intel_lock1.c (verfügbar bei der URL oben) unter Linux mit GCC 5 oder 7 ohne die Argumente '-d_with_clflush_' oder '-d_with_HLE_' (so dass weder Clflush* noch Hle Xacquire verwendet wird)-das mutex_lock montierbler sieht jetzt aus wie:

# 74 "intel_lock1.c" 1
    LFENCE
    lock subl   $1, lck(%rip)
    rep nop
    SFENCE

Also versuche ich, {l, s} Zaun durch Mfence zu ersetzen.

Ich verstehe immer noch nicht ganz, wie zwei Threads mit dem gleichen Wert von -1 *LCK haben können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top