Frage

Microsoft bietet die InterlockedCompareExchange Funktion zur Durchführung eines atomaren Vergleichs- und Swap-Operationen. Es gibt auch eine _InterlockedCompareExchange Eigen .

Auf x86 diese umgesetzt werden, um die cmpxchg Anweisung verwendet wird.

Doch auf diese drei Ansätze durch die Dokumentation zu lesen, sie scheinen nicht auf die Ausrichtungsanforderungen zu vereinbaren.

Intel Referenzhandbuch nichts über die Ausrichtung sagt (ausgenommen , wenn Ausrichtung Prüfung aktiviert ist und ein nicht ausgerichteter Speicher Bezug genommen wird, wird eine Ausnahme erzeugt wird)

Ich sah auch den lock Präfix auf, in dem es heißt insbesondere, dass

  

Die Integrität des LOCK-Präfix ist nicht durch die Ausrichtung des Speicherfeldes beeinflußt.

(Hervorhebung von mir)

So Intel scheint zu sagen, dass die Ausrichtung keine Rolle spielt. Der Betrieb wird atomar sein, egal was.

Die _InterlockedCompareExchange intrinsische Dokumentation sagt auch nichts über die Ausrichtung, aber die InterlockedCompareExchange Funktion besagt, dass

  

Die Parameter für diese Funktion müssen auf einer 32-Bit-Grenze ausgerichtet sein; andernfalls wird verhält sich die Funktion unvorhersehbar auf Multi-Prozessor x86-Systeme und alle Nicht-x86-Systemen.

Also, was soll das? Sind die Ausrichtungsanforderungen für InterlockedCompareExchange nur, um sicherzustellen, wird die Funktion arbeiten, auch auf pre-486-CPU, wo der cmpxchg Befehl nicht verfügbar ist? Das scheint wahrscheinlich auf der Grundlage der oben genannten Informationen, aber ich möchte sicher sein, bevor ich auf sie verlassen. :)

oder Ausrichtung wird durch die ISA erforderlich Unteilbarkeit zu gewährleisten, und ich bin nur die falschen Orte in Intels Referenzhandbücher?

War es hilfreich?

Lösung

Die PDF Sie zitiert werden von 1999 ist und eindeutig veraltet.

Die up-to-date Intel Dokumentation , insbesondere Volume-3A erzählt eine andere Geschichte.

Zum Beispiel auf einem Core-i7-Prozessor, Sie müssen noch sicherstellen, dass Ihre Daten nicht Cache-Zeilen nicht nicht überspannen, oder aber die Funktion nicht garantiert atomar sein.

Auf Band 3A, Systemprogrammierung, für x86 / x64 Intel eindeutig fest:

  

8.1.1 Garantierte atomare Operationen

     

Der Intel486 Prozessor (und neuere Prozessoren da) garantiert, dass folgende   Grundspeicheroperationen immer atomar ausgeführt werden:

     
      
  • Beim Lesen oder Schreiben eines Byte
  •   
  • Beim Lesen oder ein Wort auf einer 16-Bit-Grenze ausgerichtet Schreiben
  •   
  • Beim Lesen oder ein Doppelwort auf einer 32-Bit-Grenze ausgerichtet Schreiben
  •   
     

Der Pentium-Prozessor (und neuere Prozessoren da) garantiert, dass folgende   zusätzliche Speicheroperationen atomar immer durchgeführt werden:

     
      
  • Beim Lesen oder ein-fach-Wort auf einer 64-Bit-Grenze ausgerichtet Schreiben
  •   
  • 16-Bit-Zugriffe auf nicht gecachten Speicherstellen, die innerhalb eines 32-Bit-Datenbus passen
  •   
     

Die P6 Familie Prozessoren (und neuere Prozessoren da) gewährleisten, dass folgende   zusätzliche Speicheroperation atomar wird immer durchgeführt:

     
      
  • Unaligned 16-, 32- und 64-Bit-Zugriffe auf zwischengespeicherte Speicher, die in einem Cache passen   line
  •   
     

Greift zu zwischenspeicherbar Speicher, der über Cache-Zeilen und Seitengrenzen aufgeteilt werden   sind nicht als Atom durch den Intel Core 2 Duo, Intel® Atom ™, Intel Core garantiert   Duo, Pentium M, Pentium 4, Intel Xeon, P6 Familie, Pentium und Intel486 Prozessoren.   Der Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon,   und P6 Familie Prozessoren bieten Bussteuersignale die externen Speicher zulassen   Subsysteme Split greift Atom zu machen; jedoch greift nonaligned Daten   ernsthaft die Leistung des Prozessors auswirken und sollte vermieden werden

Andere Tipps

x86 hat nicht erfordern Ausrichtung für die cmpxchg Anweisung. Die Angleichung wird für Leistung empfohlen. Dies sollte keine Überraschung sein, die Abwärtskompatibilität bedeutet, dass Software vor noch mit einem manuellen ab 14 Jahren geschrieben wird auf dem heutigen Prozessoren ausgeführt werden.

Warum genau Microsoft Ausrichtung erfordert, ist aus ihrer Dokumentation nicht klar. Es kann für die Leistung oder für die Unterstützung RISC-Architekturen oder beides.

  

Intel® 64 und IA-32 Architektur Software Developer Benutzerhandbuch
  Volume 3 (3A): System Programming Guide
  Januar 2013

     

8.1.2.2 Software Controlled Bus Locking

     

explizit auf die LOCK-Semantik zu erzwingen, kann die Software den LOCK-Präfix mit den folgenden Anweisungen verwenden, wenn sie verwendet wird, einen Speicherort zu ändern. [...]

     

• Die Austauschanweisungen (XADD, cmpxchg und CMPXCHG8B).
  • Der LOCK-Präfix wird automatisch für XCHG Anweisung angenommen.
  • [...]

     

[...] Die Integrität eines Busses Sperre nicht durch die Ausrichtung der Betroffenen   Speicherfeld. Die LOCK-Semantik für so viele Buszyklen gefolgt   wie notwendig, den gesamten Operanden zu aktualisieren. Es ist jedoch empfohlen   dass Gesperrte Zugriffe auf ihre natürlichen Grenzen für besser ausgerichtet werden   Systemleistung:

     

• Jede Grenze für einen 8-Bit-Zugriff (gesperrt oder anderweitig).
  • 16-Bit-Grenze für gesperrte Wortzugriffe.
  • 32-Bit-Grenze für gesperrte Doppelwort zugreift.
  • 64-Bit-Grenze für gesperrte fach-Wort zugreift.

diese Frage SO : natürliche Ausrichtung ist wichtig für die Leistung und auf die erforderliche x64-Architektur (so ist es nicht nur PRE-x86-Systeme, aber POST-x86 diejenigen zu - x64 kann immer noch ein bisschen wie ein Nischen Fall sein, aber es wächst in der Popularität nach all ;-); das auch sein mag, warum Microsoft Dokumente es nach Bedarf (Fest docs zu finden, ob MS die Ausrichtung Problem zu erzwingen, indem ermöglicht Ausrichtung Prüfung entschieden hat - die von Windows-Version variieren, indem sie in der Dokumentation behauptet, dass die Ausrichtung erforderlich ist, MS hält die Freiheit, die sie in irgendeiner Version von Windows selbst zu zwingen, wenn sie es nicht auf andere zwingen haben).

Microsofts Verschlungene APIs auch auf ia64 angewendet (während es noch existierte). Es gab kein Schloss Präfix auf ia64, nur die cmpxchg.acq und cmpxchg.rel Anweisungen (oder fetchadd und andere ähnliche beasties), und diese alle erforderlichen Ausrichtung, wenn ich mich richtig erinnere.

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