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 ?
Alors que C 11 std::atomic
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.
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.
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.
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.
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.
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!