Maison >développement back-end >C++ >x86_64 offre-t-il une véritable prise en charge atomique pour les valeurs et les vecteurs à virgule flottante double précision ?

x86_64 offre-t-il une véritable prise en charge atomique pour les valeurs et les vecteurs à virgule flottante double précision ?

DDD
DDDoriginal
2024-12-02 02:57:10786parcourir

Does x86_64 Offer True Atomic Support for Double-Precision Floating-Point Values and Vectors?

La prise en charge atomique au niveau de l'assemblage est-elle disponible pour les doubles et les vecteurs dans x86_64 ?

Alors que C 11 std::atomic est généralement sans verrouillage sur les implémentations typiques, il est confronté à des limitations d'efficacité en raison d'inefficacités potentielles dans le code généré par le compilateur. Les compilateurs ne produisent pas toujours un assemblage optimal pour les opérations atomiques impliquant des valeurs à virgule flottante.

De plus, C 11 std::atomic ne fournit pas d'API pour les extensions de mémoire transactionnelle (TSX) d'Intel pour les nombres entiers ou flottants. opérations ponctuelles. TSX peut améliorer considérablement les performances des opérations atomiques en éliminant la surcharge associée au mouvement des données entre les registres à usage général et les registres à virgule flottante.

Charges et stockages atomiques pour les vecteurs

Malgré les affirmations selon lesquelles x86_64 manque d'atomes la prise en charge des vecteurs, des charges naturellement alignées et des magasins jusqu'à 8 octets, qui incluent les vecteurs, sont atomiques sur les processeurs x86. Cela inclut les charges et les magasins utilisant des instructions x87 ou SSE. Par conséquent, les charges alignées et les magasins de valeurs à virgule flottante double précision sont atomiques.

Opérations atomiques de lecture-modification-écriture

Les opérations atomiques de lecture-modification-écriture (telles que l'addition atomique) sont n'est pas directement pris en charge pour les valeurs ou les vecteurs à virgule flottante double précision. La seule option pour ces opérations sur x86_64 est une nouvelle tentative en utilisant l'instruction cmpxchg ou TSX.

Cas particuliers pour les opérations atomiques

Certains cas particuliers pour les opérations à virgule flottante IEEE peuvent être implémentés en utilisant des nombres entiers. opérations. Par exemple, l'annulation d'une valeur à virgule flottante double précision peut être obtenue en inversant le bit de signe à l'aide d'une opération atomique.

Charges et stockages de vecteurs atomiques

Bien qu'il n'y ait aucune garantie matérielle pour les valeurs atomiques charges et stockages vectoriels, il est généralement prudent de supposer que les charges vectorielles alignées et les stockages de valeurs à virgule flottante double précision n'entraîneront pas de déchirure. Cependant, les opérations vectorielles atomiques impliquant des valeurs non alignées peuvent ne pas être sûres. L'exception à cela concerne la fonctionnalité AVX d'Intel, qui garantit une atomicité de 128 bits pour les opérations SSE/AVX.

Opérations atomiques sur des objets 16B

Pour effectuer des opérations atomiques sur des objets de 16 octets, qui est plus grand que la largeur d'opération atomique native, le verrou cmpxchg16b doit être utilisé. Cela peut entraîner une surcharge de performances importante par rapport aux opérations atomiques normales, ce qui le rend inadapté aux scénarios où les performances sont critiques.

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