Maison >développement back-end >C++ >Comment réaliser des opérations atomiques sur les doubles et les vecteurs sur x86_64 malgré les limitations de C ?

Comment réaliser des opérations atomiques sur les doubles et les vecteurs sur x86_64 malgré les limitations de C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-28 06:06:19365parcourir

How Can Atomic Operations on Doubles and Vectors Be Achieved on x86_64 Despite C   Limitations?

Malgré les limitations de std::atomic de C, qui ne dispose pas d'un support sans verrouillage, x86_64 fournit un support au niveau de l'assembleur pour certaines opérations atomiques sur les doubles et les vecteurs.

Doubles opérations atomiques sur x86_64

  • Les charges et les magasins naturellement alignés (jusqu'à 8 octets) sont atomiques.
  • Les opérations de lecture-modification-écriture atomiques (RMW) nécessitent une boucle de nouvelle tentative avec cmpxchg .
  • cmpxchg16b peut être utilisé pour des charges atomiques de 16 octets, magasins et RMW.

Opérations vectorielles SSE/AVX sur x86_64

Bien que C ne prenne actuellement pas en charge les opérations vectorielles atomiques AVX/SSE, il n'y a aucun moyen pour garantir les transferts atomiques de lignes de cache 128b ou 256b sur l'ensemble du système.

Cependant, certaines précautions peuvent être prises pour minimiser le risque de déchirure lors de l'utilisation de charges/stockages vectoriels sur des tableaux partagés de doubles alignés.

Charge atomique 16B

  • Utilisation du verrouillage cmpxchg16b avec wanted=expected peut fournir un 16B atomique charge.

Atomic 16B Store et RMW

  • le verrou cmpxchg16b peut être utilisé pour les magasins atomiques 16B et les opérations RMW.

Opérations atomiques sur des objets 16B avec 8B Moitiés

  • Il est possible de mettre à jour atomiquement un objet 16B tout en lisant ses moitiés 8B indépendamment.

Compilateurs et opérations atomiques

Les compilateurs ne génèrent pas toujours un code assembleur optimal pour les opérations atomiques. Par exemple, ils peuvent éviter les chargements/stockages directs movsd entre XMM et les doubles registres, optant plutôt pour des méthodes détournées.

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!

Déclaration:
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