Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-23 14:52:20
original
708 Les gens l'ont consulté

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 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

Alors qu'un simple mov-store suivi d'une barrière de mémoire (telle que mfence) pourrait théoriquement fournir une sémantique de version, cela n'est pas suffisant pour les opérations de magasin à libération 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 la version séquentielle 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 se synchroniser 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.

Mise en œuvre Détails

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 : J'utilisais à l'origine mov-store mfence, mais j'ai récemment opté pour XCHG pour seq-cst. magasins.
  • Compilateur Intel : Utilise XCHG pour les magasins seq-cst.
  • Microsoft Visual C : Utilise également XCHG pour les magasins seq-cst.

Acquisition implicite Clôture

L'affirmation selon laquelle les magasins x86 ont une clôture d'acquisition implicite 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 d'opérations de lecture atomique avec la sémantique std::memory_order_acquire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal