


x86_64 offre-t-il une véritable prise en charge atomique pour les valeurs et les vecteurs à virgule flottante double précision ?
Dec 02, 2024 am 02:57 AMLa 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<double> 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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Gulc: Cibliothèque C construite à partir de zéro

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Comment fonctionne la bibliothèque de modèle standard C (STL)?

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Utilisation distincte et partage de phrases

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?
