"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi le magasin `std::atomic` utilise-t-il XCHG pour la cohérence séquentielle sur x86 ?

Pourquoi le magasin `std::atomic` utilise-t-il XCHG pour la cohérence séquentielle sur x86 ?

Publié le 2024-11-18
Parcourir:190

Why does `std::atomic`\'s store use XCHG for sequential consistency on x86?

Pourquoi le magasin de std::atomic utilise XCHG pour la cohérence séquentielle

Dans le contexte de std::atomic pour les architectures x86 et x86_64, un L'opération de stockage avec cohérence séquentielle (std::memory_order_seq_cst) utilise XCHG au lieu d'un simple magasin avec une barrière de mémoire comme technique pour obtenir une sémantique de libération séquentielle.

Cohérence séquentielle et xchg

La cohérence séquentielle dicte que toutes les opérations de mémoire semblent s'exécuter dans un ordre séquentiel, et cet ordre est le même pour tous les threads. XCHG, une instruction x86 qui échange atomiquement les valeurs de deux opérandes, satisfait intrinsèquement à cette exigence de cohérence séquentielle. En utilisant XCHG pour effectuer une opération d'écriture, std::atomic garantit que le magasin devient globalement visible par tous les threads à un moment spécifique de l'ordre d'exécution, empêchant ainsi la réorganisation avec les opérations ultérieures.

mov- store mfence vs XCHG

Bien qu'un simple mov-store suivi d'une barrière mémoire (telle que mfence) puisse théoriquement fournir une sémantique de version, cela n'est pas suffisant pour les opérations de stockage à version séquentielle. MFENCE, une instruction de clôture de mémoire qui établit une barrière de mémoire, garantit que les opérations d'écriture précédentes sont validées en mémoire avant de continuer. Cependant, cela n'empêche pas les opérations de chargement ultérieures d'être réorganisées avant le magasin de versions.

Considérations relatives aux performances

Le choix entre mov-store mfence et XCHG pour les versions séquentielles les opérations du magasin impliquent des compromis en termes de performances.

  • Sur certains processeurs (par exemple, Intel Skylake), XCHG peut être plus efficace que mov-store mfence, en particulier lorsqu'il n'y a pas de code dépendant environnant qui doit être synchronisé. avec l'opération atomique.
  • Sur d'autres processeurs, mov-store mfence peut être préférable pour les scénarios à haut débit ou lorsque le code environnant peut chevaucher l'exécution avec l'opération atomique.

Détails d'implémentation

En pratique, l'implémentation spécifique du magasin de std::atomic avec cohérence séquentielle varie en fonction du compilateur et de l'architecture matérielle.

  • GCC/ Clang : Initialement utilisé mov-store mfence, mais a récemment basculé vers XCHG pour les magasins seq-cst.
  • Compilateur Intel : Utilise XCHG pour les magasins seq-cst.
  • Microsoft Visual C : Utilise également XCHG pour les magasins seq-cst.

Implicit Acquire Fence

La déclaration selon laquelle x86 les magasins ont une clôture d'acquisition implicite qui est incorrecte. Les magasins sur x86 ont une sémantique de version et non d'acquisition. La sémantique d'acquisition est généralement appliquée à l'aide de barrières de mémoire telles que mfence ou des opérations de lecture atomique avec la sémantique std::memory_order_acquire.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3