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 ?

Comment les opérations atomiques à virgule flottante et vectorielles sont-elles gérées sur les architectures x86_64 ?

Mary-Kate Olsen
Libérer: 2024-12-07 06:08:15
original
483 Les gens l'ont consulté

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

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 implémentations sur la plupart des plateformes. Ces implémentations utilisent généralement des opérations de comparaison et d'échange (CAS) avec l'instruction de verrouillage cmpxchg.

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 :

  • Doubles : Atomic les chargements, les stockages et les opérations d'ajout/soustraction/multiplication sont pris en charge via les instructions de destination mémoire movsd, movq, addd, subsd et mulsd.
  • Vecteurs : Alignés sur 128 bits et 256 Les charges et les magasins de -bit sont atomiques sur x86_64 avec prise en charge AVX. Pour les opérations vectorielles non alignées, il n'y a aucune garantie matérielle directe d'atomicité.

MSVC 2017 Implémentation de Lock-Free atomique

MSVC 2017 implémente l'atomique opérations utilisant des registres entiers double largeur. Par exemple, l'opération de chargement implique :

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS
Copier après la connexion

L'opération d'ajout utilise :

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS
Copier après la connexion

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
Copier après la connexion

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

  • Certains matériels non x86 prend en charge les opérations d'ajout atomique pour les types float/double.
  • Les extensions de mémoire transactionnelle (TSX) d'Intel offrent une prise en charge améliorée des opérations atomiques FP et SIMD.
  • Les compilateurs génèrent souvent du code inefficace pour les opérations atomiques opérations, mais des améliorations sont en cours.
  • Les opérations atomiques sur des tableaux partagés de doubles alignés devraient être sûres, tandis que les opérations sur des vecteurs non alignés peuvent impliquer un déchirement.
  • Il est possible d'implémenter des opérations atomiques sur 16 -byte objets utilisant cmpxchg16b, mais les performances seront médiocres.

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