Maison >développement back-end >C++ >Comment pouvons-nous implémenter efficacement log2(__m256d) dans AVX2 pour les processeurs Intel et AMD ?

Comment pouvons-nous implémenter efficacement log2(__m256d) dans AVX2 pour les processeurs Intel et AMD ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-27 15:49:10630parcourir

How Can We Efficiently Implement log2(__m256d) in AVX2 for Both Intel and AMD Processors?

Implémentation efficace de log2(__m256d) dans AVX2

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.

    Approximation polynomiale :
  1. Une approximation polynomiale est appliquée à la mantisse ajustée pour calculer log(x) autour de x=1,0. Pour une double précision, VCL utilise un rapport de deux polynômes d'ordre 5.
  2. Le résultat final est obtenu en ajoutant l'exposant à l'approximation du polynôme. VCL comprend des étapes supplémentaires pour minimiser les erreurs d'arrondi.
  3. approximations polynomiales alternatives

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 polynomiale

  • Suppression des étapes inutiles
  • Si vos valeurs sont connues pour être finies et positives, vous pouvez améliorer considérablement les performances en commentant les vérifications pour sous-débordement, débordement ou dénormalité.

En outre Lecture

  • [Rapproximation polynomiale avec erreur minimax](http://gallium.inria.fr/blog/fast-vectorizing-math-approx/)
  • [Logarithme approximatif rapide utilisant bit manipulation](http://www.machinedlearnings.com/2011/06/fast-approximate-logarithm-exponential.html)

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