Conversions efficaces Double/int64 avec SSE/AVX
Alors que SSE2 fournit des instructions pour convertir des vecteurs entre des flottants simple précision et des entiers 32 bits , les intrinsèques correspondants pour les entiers double précision et 64 bits sont manquants. Même AVX ne propose pas ces conversions.
Techniques de repli
En l'absence d'instructions dédiées, il existe plusieurs approches pour simuler ces conversions :
- For values in specific ranges, using a shifted add and a bitwise XOR can convert double to uint64_t or int64_t in just two instructions. - Reversing these steps can perform the inverse conversions.
Conversions de plage complète :
Détails de mise en œuvre
L'astuce pour les conversions tronquées repose sur le le fait que les valeurs à virgule flottante double précision dans la plage [2 ^ 52, 2 ^ 53) ont leur mantisse la plus basse bit s'alignant sur le bit le moins significatif. En ajoutant une valeur de masque spécifique et en effectuant une opération au niveau du bit, la représentation entière peut être obtenue.
Les conversions complètes résolvent les problèmes d'extension de signe et exploitent le fait que l'ajout en virgule flottante sur x86 peut annuler bits fractionnaires, permettant la reconstruction précise du résultat en double précision.
Comportement d'arrondi
Le les méthodes de conversion tronquées suivent le mode d'arrondi actuel, sauf que l'arrondi vers zéro peut arrondir vers l'infini négatif. Les conversions de plage complète garantissent un arrondi correct pour tous les modes.
Disponibilité
Les techniques présentées fournissent une solution de contournement au manque de conversions int64_t directes et doubles dans SSE/AVX. Ces méthodes peuvent être particulièrement utiles pour optimiser le code là où ces conversions sont requises, offrant un équilibre entre efficacité et précision.
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!