Heim > Backend-Entwicklung > C++ > Wann sollten Sie _mm_sfence, _mm_lfence oder _mm_mfence verwenden?

Wann sollten Sie _mm_sfence, _mm_lfence oder _mm_mfence verwenden?

Patricia Arquette
Freigeben: 2024-11-18 00:05:02
Original
458 Leute haben es durchsucht

When Should You Use _mm_sfence, _mm_lfence, or _mm_mfence?

Entscheidung, wann _mm_sfence, _mm_lfence oder _mm_mfence eingesetzt werden soll

Bei der Verwendung von Multithread-Code besteht die Notwendigkeit, die Speicherreihenfolge effektiv zu steuern. Während x86-Prozessoren über ein streng geordnetes Speichermodell verfügen, folgen C und C einem entspannteren Modell. Dies kann zu Verwirrung hinsichtlich der angemessenen Verwendung der intrinsischen Elemente _mm_sfence, _mm_lfence und _mm_mfence führen.

Speicherreihenfolge verstehen

Zur Erfassungs-/Freigabesemantik, um eine Neuordnung zur Kompilierungszeit zu verhindern Allein reicht aus, wie das Konzept der Compiler-Barrieren unterstreicht. Dies gewährleistet die ordnungsgemäße Reihenfolge der Vorgänge in der abstrakten Maschine, ohne die Leistung durch unnötige ASM-Anweisungen zu beeinträchtigen. Optionen wie GNU C/C asm("" ::: "memory") fungieren effektiv als Compiler-Barrieren und erreichen dieses Ziel bei gleichzeitiger Minimierung der Leistungseinbußen.

Alternativ bietet C 11 std::atomic eine nahtlose Lösung mit shared_var.store(tmp, std::memory_order_release) sorgt für globale Sichtbarkeit von Änderungen. _mm_mfence bietet potenziellen Wert, wenn Sie Ihre eigene Version von C11/C 11 std::atomic implementieren und mfence verwenden, um sequentielle Konsistenz herzustellen und zu verhindern, dass nachfolgende Ladevorgänge Werte abrufen, bevor vorherige Speicher global zugänglich werden.

Untersuchung der Rollen jedes einzelnen Bestandteils

_mm_sfence:

  • Ideal für NT-Stores, die einen Zaun erfordern, bevor ein Flag gesetzt wird, auf das sich andere Threads verlassen .
  • Gewährleistet die Release-/Acquire-Synchronisierung bei Verwendung von NT-Stores, die im Gegensatz zu regulären Stores schwach geordnet sind.

_mm_lfence:

  • Wird selten als Lastzaun verwendet, da Lasten nur schwach geordnet sind, wenn WC-Speicherbereiche (Write-Combining) beteiligt sind.
  • Kann verwendet werden, um den Ausführungsfluss auf einigen Prozessoren zu steuern und zu verhindern, dass spätere Anweisungen bis zur Lastzaun ausgeführt werden ist abgeschlossen.

_mm_mfence:

  • Potenziell nützlich für die Implementierung Ihrer eigenen Version von std::atomic, wobei mfence für sequentielle Konsistenz genutzt wird.
  • Hinweis: mfence kann langsamer sein als gesperrte atomare RMW-Operationen.

Vorsichtshinweise zur Leistung

Es ist wichtig zu beachten, dass dies bei Zäunen nicht der Fall ist Beschleunigen Sie die Sichtbarkeit von Geschäften. Sie verschieben lediglich Vorgänge innerhalb des aktuellen Threads, bis vorhergehende Vorgänge abgeschlossen sind.

Fazit

Für allgemeine Anwendungsfälle bieten C 11 std::atomic oder C11 stdatomic Robustheit und benutzerfreundliche Lösungen zur Steuerung der Speicherordnung. In Szenarien mit NT-Speichern oder benutzerdefinierten Implementierungen von std::atomic können sich _mm_sfence und _mm_mfence als wertvoll erweisen, eine sorgfältige Abwägung ihrer Auswirkungen auf die Leistung ist jedoch von entscheidender Bedeutung.

Das obige ist der detaillierte Inhalt vonWann sollten Sie _mm_sfence, _mm_lfence oder _mm_mfence verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage