Maison >développement back-end >C++ >Comment pouvons-nous implémenter efficacement log2(__m256d) dans AVX2 pour les processeurs Intel et AMD ?
Le __m256d _mm256_log2_pd (__m256d a) de SVML est limité aux compilateurs Intel et serait plus lent sur les processeurs AMD. Des implémentations alternatives existent, mais elles se concentrent souvent sur SSE plutôt que sur AVX2. Cette discussion vise à fournir une implémentation efficace de log2() pour les vecteurs de quatre nombres doubles, compatible avec divers compilateurs et fonctionnant bien sur les processeurs AMD et Intel.
Stratégie traditionnelle
L'approche habituelle exploite la formule log2(a*b) = log2(a) log2(b), qui se simplifie en exposant log2(mantisse) pour les nombres doubles. La mantisse a une plage limitée de 1,0 à 2,0, ce qui la rend adaptée à une approximation polynomiale pour obtenir log2 (mantisse). La gamme d’intrants influence la mise en œuvre. Le VCL d'Agner Fog vise une haute précision en utilisant des techniques d'évitement des erreurs. Cependant, pour un float log() approximatif plus rapide, considérez l'implémentation polynomiale de JRF (trouvée ici : http://jrfonseca.blogspot.ca/2008/09/fast-sse2-pow-tables-or-polynomials.html).
Algorithme VCL
Le log float et les fonctions doubles de VCL suivent un processus en deux parties approche :
Extraire l'exposant et la mantisse :
L'exposant est reconverti en flottant et la mantisse est ajustée en vérifiant les valeurs inférieures à SQRT2*0,5. Ceci est suivi d'une soustraction de 1,0 de la mantisse.Pour une précision accrue, vous pouvez utiliser directement VCL. Cependant, pour une implémentation approximative plus rapide de log2() pour float, envisagez de porter la fonction SSE2 de JRF vers AVX2 avec FMA.
Éviter les erreurs d'arrondi
VCL utilise diverses techniques pour réduire erreur d'arrondi. Ceux-ci incluent :
Diviser ln2 en constantes plus petites (ln2_lo et ln2_hi)
Ajout de la ligne res = nmul_add(x2, 0.5, x); à l'évaluation polynomialeEn outre Lecture
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!