Maison > développement back-end > C++ > Pourquoi le magasin `std::atomic` utilise-t-il XCHG pour la cohérence séquentielle ?

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

Susan Sarandon
Libérer: 2024-11-22 02:59:11
original
613 Les gens l'ont consulté

Why Does `std::atomic`'s Store Use XCHG for Sequential Consistency?

Pourquoi le magasin de std::atomic utilise-t-il XCHG lorsqu'une cohérence séquentielle est demandée ?

Alors qu'une opération de magasin à cohérence séquentielle peut apparaître au début comme quelque chose qui peut être implémenté à l'aide d'une simple instruction de stockage suivie d'une barrière de mémoire, l'utilisation de XCHG (avec un préfixe de verrouillage implicite) offre une solution plus optimale. solution.

XCHG et cohérence séquentielle

Sur les architectures x86 et x86_64, XCHG fournit à la fois un échange de mémoire et une barrière de mémoire complète, garantissant un ordre séquentiel des opérations de mémoire. Cela en fait un moyen efficace de mettre en œuvre des magasins de cohérence séquentielle.

Limitations des instructions de magasin régulières

Une instruction de magasin régulière à elle seule, telle que MOV, ne peut pas garantir une cohérence séquentielle. . Il fournit uniquement une sémantique de version, ce qui lui permet d'être réorganisé avec des opérations ultérieures, y compris des charges d'acquisition.

Considérations sur les performances

Bien que MFENCE et XCHG puissent être utilisés pour implémenter magasins à cohérence séquentielle, ils présentent des caractéristiques de performances différentes sur différents processeurs. Sur certains processeurs, MFENCE peut bloquer l'exécution dans le désordre des instructions voisines. En revanche, XCHG peut être plus efficace pour les opérations monothread ou lorsque la ligne mise en cache est chaude dans le cache L1.

Pratiques du compilateur et du noyau

Divers compilateurs et systèmes d'exploitation les systèmes préfèrent différentes approches pour implémenter des magasins à cohérence séquentielle. GCC utilisait historiquement MOV MFENCE, tandis que d'autres compilateurs et le noyau Linux utilisent XCHG.

Notes supplémentaires

Il est important de noter que :

  • Clôtures d'acquisition implicites : Vous avez peut-être mentionné que les magasins x86 ont un implicite acquérir une clôture, mais c'est incorrect. Les magasins ont implicitement une sémantique release, et non une sémantique d'acquisition.
  • Barrières du compilateur : La syntaxe asm volatile("" ::: "memory") que vous avez fournie est un compilateur -barrière de niveau, pas une barrière de mémoire d'exécution.
  • Fences vs. Release Opérations : Bien que les clôtures et les opérations de libération puissent partager des similitudes, ce sont des mécanismes distincts dans x86.

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