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