Maison >développement back-end >C++ >Comment les opérations atomiques à virgule flottante et vectorielles sont-elles gérées sur les architectures x86_64 ?
Opérations à virgule flottante atomique sur x86_64
Bien que C ne prenne pas en charge nativement les opérations doubles atomiques, il fournit des opérations atomiques
Pour les opérations vectorielles atomiques sur x86_64, il n'y a pas de prise en charge matérielle directe. Cependant, il est généralement garanti que les charges et les magasins alignés de 128 bits et 256 bits sont atomiques. Pour les opérations vectorielles non alignées, les garanties d'atomicité sont moins claires.
Prise en charge au niveau de l'assemblage pour les opérations doubles et vectorielles
x86_64 fournit une prise en charge au niveau de l'assemblage pour les opérations atomiques. sur les doubles et les vecteurs :
MSVC 2017 Implémentation de Lock-Free atomique
MSVC 2017 implémente l'atomique
CAS: movq QWORD PTR [dst_addr], rax // 64-bit CAS
L'opération d'ajout utilise :
CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax // 128-bit CAS
Opérations RMW atomiques (lecture-modification-écriture)
Les opérations atomiques de lecture-modification-écriture (RMW), telles que fetch_add, nécessitent une implémentation de boucle CAS. Sur x86_64, l'instruction CAS prend en charge les opérations sur 16 octets (cmpxchg16b).
CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax
Bien que les boucles CAS fournissent une fonctionnalité RMW atomique, elles sont plus coûteuses que les charges et les magasins atomiques.
Remarques supplémentaires
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!