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