Maison > développement back-end > C++ > Comment implémenter efficacement log2(__m256d) dans AVX2 sans les dépendances du compilateur Intel ?

Comment implémenter efficacement log2(__m256d) dans AVX2 sans les dépendances du compilateur Intel ?

Patricia Arquette
Libérer: 2024-12-15 12:03:10
original
948 Les gens l'ont consulté

How to Efficiently Implement log2(__m256d) in AVX2 without Intel's Compiler Dependencies?

Implémentation efficace de log2(__m256d) dans AVX2

Dans le contexte d'AVX2, la fonction __m256d _mm256_log2_pd (__m256d a) d'Intel n'est pas compatible avec d'autres compilateurs qu'Intel et présenterait des performances réduites sur les processeurs AMD. Pour résoudre ce problème, explorons une implémentation alternative qui offre efficacité et compatibilité étendue.

Stratégies d'approximation de log2

En général, log2(ab) est calculé comme log2(a) log2 (b). Puisque a est représenté par une mantisse 2^exposant , le calcul se simplifie en exposant log2(mantisse). La plage limitée de mantisse (1,0 à 2,0) permet une approximation polynomiale personnalisée pour calculer log2 (mantisse).

approximation polynomiale

Les développements en série de Taylor sont couramment utilisés comme points de départ pour les coefficients, mais Un ajustement minimax est recommandé pour minimiser les erreurs sur la plage cible. Pour une plus grande précision autour des valeurs proches de 1,0, la mantisse-1,0 peut être utilisée comme entrée polynomiale, éliminant ainsi le besoin d'un terme constant.

Considérations sur la précision

Le niveau de précision souhaité influencera les choix de mise en œuvre . Une plus grande précision se fait généralement au détriment de la vitesse en raison des étapes de calcul supplémentaires. La bibliothèque VCL d'Agner Fog fournit des fonctions très précises mais utilise des techniques complexes qui peuvent ne pas être essentielles pour toutes les applications.

Algorithme VCL pour log2

La fonction log2 de VCL implique les étapes suivantes :

  1. Extraire et convertir les bits d'exposant en flottant.
  2. Ajuster le mantisse à [0.5, 1.0) ou (0.5, 1.0], suivie d'une soustraction de 1.0.
  3. Application d'une approximation polynomiale pour calculer log(x) autour de x=1.0, en utilisant soit un seul polynôme d'ordre 5 ( double) ou un rapport de deux polynômes d'ordre 5 (float).
  4. Ajout exposant polynomial_approx_log(mantissa) pour obtenir le résultat final.

Étapes pour améliorer la précision et la vitesse

Pour améliorer la précision :

  • Envisagez d'utiliser un indicateur plus précis approximation polynomiale.
  • Évitez la soustraction de 1,0 (laissez comme mantisse - 1.0) pour réduire la perte potentielle de précision.

Pour optimiser la vitesse :

  • Utilisez des approximations polynomiales tronquées avec moins de termes.
  • Utilisez des instructions vectorisées pour traiter plusieurs valeurs simultanément.
  • Éliminez les vérifications inutiles pour les cas particuliers (par exemple, dépassement insuffisant, débordement, dénormal) si les valeurs d'entrée sont connues pour être finies et positives.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal