Maison > développement back-end > C++ > x86_64 prend-il en charge les opérations atomiques sur les vecteurs doubles et SSE/AVX ?

x86_64 prend-il en charge les opérations atomiques sur les vecteurs doubles et SSE/AVX ?

Mary-Kate Olsen
Libérer: 2024-11-27 06:58:10
original
1014 Les gens l'ont consulté

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

Opérations atomiques à virgule flottante et chargement/stockage de vecteurs SSE/AVX sur x86_64

Bien que C 11 prenne en charge std::atomic sans verrouillage, il le fait ne prend actuellement pas en charge les vecteurs atomiques AVX/SSE en raison des dépendances du processeur. Cependant, la question se pose : x86_64 fournit-il une prise en charge au niveau de l'assemblage pour les opérations atomiques sur les doubles ou les vecteurs ?

Opérations atomiques sur x86_64

x86_64 prend en charge les opérations atomiques suivantes sur les doubles, effectuées à l'aide de lock- gratuit instructions :

  • Charger
  • Store
  • Ajouter
  • Soustraire
  • Multiplier

Atomique Opérations vectorielles sur x86_64

Malheureusement, il existe aucun moyen de garantir l'atomicité des magasins ou des charges de vecteurs 128b ou 256b à travers le système de cohérence du cache. Cependant, pour les vecteurs alignés, vous pouvez utiliser en toute sécurité des charges vectorielles et des magasins sur des tableaux doubles partagés sans risque de déchirure.

Si des charges atomiques 16B sont requises, votre seule option est d'utiliser le verrou cmpxchg16b avec désiré = attendu. s'il réussit, il remplace la valeur existante par elle-même. En cas d'échec, vous récupérez l'ancien contenu. Notez que ce "chargement" échoue sur la mémoire en lecture seule, alors soyez prudent lorsque vous passez des pointeurs vers des fonctions qui effectuent cette opération.

Les magasins Atomic 16B et RMW peuvent tous deux utiliser le verrou cmpxchg16b de manière évidente. Cela rend les magasins purs beaucoup plus chers que les magasins vectoriels classiques, en particulier avec plusieurs tentatives cmpxchg16b. Cependant, le RMW atomique est déjà cher.

Limitations des opérations vectorielles atomiques

  • atomic<__m128d> serait lent même pour les opérations en lecture seule ou en écriture seule en raison de l'utilisation de cmpxchg16b.
  • atomic<__m256d> ne peut pas être sans verrouillage.
  • alignas(64) atomique shared_buffer[1024]; permettrait la vectorisation automatique, mais les compilateurs ne génèrent pas d'asm efficace pour cela.

Lecture et mise à jour atomiques des objets 16B

Vous pouvez mettre à jour atomiquement les objets 16B mais lire les moitiés 8B séparément. Cependant, les compilateurs ne fournissent pas de moyen propre d'exprimer cela, et l'inclusion de cmpxchg16b n'est pas fiable en raison de considérations continues de la part des développeurs du compilateur.

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