Atomic Double Floating Point oder SSE/AVX-Vektor laden/speichern auf x86_64

Lesezeit: 2 Minuten

Atomic Double Floating Point oder SSEAVX Vektor ladenspeichern auf
Serge Rogatch

Hier (und in ein paar SO-Fragen) sehe ich, dass C++ so etwas wie lock-free nicht unterstützt std::atomic<double> und kann so etwas wie einen atomaren AVX/SSE-Vektor noch nicht unterstützen, da er CPU-abhängig ist (obwohl heutzutage von CPUs, die ich kenne, ARM, AArch64 und x86_64 Vektoren haben).

Aber gibt es Unterstützung auf Assembly-Ebene für atomare Operationen? doubles oder Vektoren in x86_64? Wenn ja, welche Operationen werden unterstützt (wie Laden, Speichern, Addieren, Subtrahieren, Multiplizieren vielleicht)? In welchen Operationen implementiert MSVC++ 2017 lock-free? atomic<double>?

  • atomic<double> ist lock-free auf meiner Plattform (GCC, x86-64) und wahrscheinlich auch auf MSVC++. Ich verstehe nicht, warum Sie denken, dass Ihr Link etwas anderes zeigt. Aber, std::atomic bietet nur arithmetische Operationen auf Integer-Typen, also mit atomic<double> Sie können nur grundlegende Operationen wie Laden/Speichern/Austauschen ausführen.

    – zwischenjay

    12. Juli 2017 um 10:57 Uhr


  • @interjay , bei diesem Link gibt es keine Konstante für double wie ATOMIC_POINTER_LOCK_FREE, ATOMIC_LLONG_LOCK_FREEetc.

    – Serge Rogatch

    12. Juli 2017 um 11:12 Uhr


  • Es gibt keine Konstante, aber std::atomic<double>().is_lock_free() kann (und tut) immer noch zurückkehren true.

    – zwischenjay

    12. Juli 2017 um 11:18 Uhr

  • Nur ein kleiner Hinweis darauf lock cmpxchg16b wird von MSVC++2017 bereitgestellt _InterlockedCompareExchange128: docs.microsoft.com/en-us/cpp/intrinsics/… . Ich konnte bisher Intel-Intrinsisch dafür nicht finden.

    – Serge Rogatch

    14. Juli 2017 um 9:06 Uhr

  • “Laden der Bitdarstellung des Gleitkommawerts in ein Ganzzahlregister”. Ich könnte mich irren, aber die SSE/AVX-Register sind weder FP noch Integer, sondern die SSE/AVX-Anweisungen. Und SSE/AVX-Lade-/Speicheroperationen sind bitweise, also weder FP noch Integer.

    – MSalter

    12. Juli 2017 um 11:35 Uhr

  • Da sind die Anleitungen cmpxchg8b, cmpxchg16b die das CASsing von 64/128 Bits ermöglichen, wodurch generische atomare Operationen auf doubles/SSE ermöglicht werden. Außerdem sind RMW-Befehle nicht notwendigerweise schneller als eine Lade-/Operations-/Speichersequenz.

    – Margaret Bloom

    12. Juli 2017 um 11:40 Uhr

  • Du brauchst nicht lock für eine Ladung oder einen Speicher, nur für atomares RMW.

    – Peter Cordes

    12. Juli 2017 um 16:41 Uhr

  • @MSalters Ja, technisch gesehen sind nicht die Register “Gleitkomma”, sondern die Anweisungen. Ich denke jedoch nicht, dass dies im Kontext dieser Frage von Bedeutung ist, und ich bin mir nicht sicher, wie ich das klarstellen soll, ohne die Antwort zu verkomplizieren.

    – avdgrinten

    12. Juli 2017 um 19:29 Uhr

  • @PeterCordes Guter Punkt, ich habe die Antwort bearbeitet, um anzugeben, welche Speicher / Lasten garantiert atomar sind.

    – avdgrinten

    12. Juli 2017 um 19:29 Uhr

953570cookie-checkAtomic Double Floating Point oder SSE/AVX-Vektor laden/speichern auf x86_64

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy