Maison  >  Article  >  développement back-end  >  Pourquoi « std :: atomic » utilise-t-il « XCHG » pour les magasins séquentiellement cohérents ?

Pourquoi « std :: atomic » utilise-t-il « XCHG » pour les magasins séquentiellement cohérents ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 01:37:14990parcourir

Why Does `std::atomic` Use `XCHG` for Sequentially Consistent Stores?

Pourquoi std::atomic utilise XCHG pour les magasins de cohérence séquentielle

Contexte

Dans le domaine du multithreading, la classe std::atomic fournit un des moyens pour un accès simultané aux données partagées entre les threads tout en garantissant l'intégrité des données. Sa fonction membre de magasin permet d'écrire des valeurs dans une variable atomique avec une sémantique d'ordre de mémoire spécifiée.

Dans le cas d'une cohérence séquentielle (std::memory_order_seq_cst), les architectures x86 utilisent une instruction xchg pour implémenter des magasins atomiques. Cette instruction effectue un échange simultané de valeurs plutôt qu'une simple opération de stockage.

Motivation pour XCHG

Bien qu'il puisse sembler qu'une instruction de stockage simple couplée à une barrière de mémoire (par exemple, _ReadWriteBarrier() ou asm volatile("" ::: "memory");) suffirait pour la cohérence séquentielle, l'utilisation de xchg a plusieurs avantages :

1. Barrière de mémoire complète : xchg agit comme une barrière de mémoire complète sur x86 en raison de son préfixe de verrouillage implicite. Cela garantit que toutes les opérations de mémoire avant et après xchg sont ordonnées, empêchant ainsi la réorganisation de la mémoire.

2. La sémantique de version est insuffisante : Une opération de magasin normale sur x86 présente une sémantique de version, qui permet une réorganisation avec les opérations ultérieures, y compris l'acquisition de charges. La cohérence séquentielle, en revanche, exige qu'une telle réorganisation soit interdite.

Considérations sur les performances

Le choix entre xchg et mov mfence pour les magasins atomiques a des implications sur les performances :

  • Skylake : mfence bloque l'exécution dans le désordre des instructions ALU, alors que xchg le fait pas. Cependant, xchg comporte une fausse dépendance sur la valeur précédemment chargée.
  • AMD : Le manuel d'optimisation matérielle recommande d'utiliser xchg pour les magasins de cohérence séquentielle.
  • GCC/ Optimisation Clang : Les compilateurs modernes préfèrent généralement xchg à mov mfence.

Alternative pour les clôtures de threads

Outre l'utilisation de xchg pour les magasins atomiques, d'autres options pour implémenter des clôtures de threads atomiques (également avec l'ordre de mémoire seq_cst) incluent :

  • lock ajouter à la pile
  • lock ou dword [rsp], 0

Distinguer libération et acquisition

Il est important de noter que :

  • Un magasin avec une cohérence séquentielle n'implique pas l'acquisition de sémantique.
  • asm volatile("" ::: "memory"); est une barrière du compilateur uniquement et n'impose pas la cohérence séquentielle.
  • L'émulation de la cohérence séquentielle avec des opérations d'ordre plus faibles et des clôtures peut ne pas s'aligner entièrement sur le modèle de machine abstraite C.

Conclusion

En résumé, les magasins std::atomic avec cohérence séquentielle sur les architectures x86 utilisent xchg en raison de son effet de barrière mémoire complète et de sa compatibilité avec les exigences. de cohérence séquentielle. Bien que des implémentations alternatives existent, xchg reste une solution largement adoptée pour son efficacité et sa conformité aux recommandations de l'industrie.

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!

Déclaration:
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