Maison > développement back-end > C++ > Comment l'AVX2 peut-il être utilisé le plus efficacement possible pour l'emballage à gauche avec un masque ?

Comment l'AVX2 peut-il être utilisé le plus efficacement possible pour l'emballage à gauche avec un masque ?

Patricia Arquette
Libérer: 2024-12-22 16:39:10
original
651 Les gens l'ont consulté

How Can AVX2 Be Used Most Efficiently for Left Packing with a Mask?

Problème d'emballage à gauche

Considérez le scénario dans lequel il existe un tableau d'entrée et un tableau de sortie, mais seuls certains éléments satisfaisant une condition doivent être écrit dans le tableau de sortie. Quelle est l'approche la plus efficace pour y parvenir en utilisant AVX2 ?

Approche SSE

L'approche SSE consiste à utiliser _mm_movemask_ps pour extraire un masque de 4 bits du masque de saisie, puis en utilisant ce masque pour générer des données de contrôle aléatoire avec _mm_load_si128. Enfin, _mm_shuffle_epi8 est utilisé pour permuter les valeurs afin d'aligner les éléments valides au début du registre SIMD. Cette approche fonctionne bien pour les vecteurs SSE de 4 largeurs avec une table de recherche (LUT) à 16 entrées.

Limites AVX

Cependant, pour AVX de 8 largeurs vecteurs, la LUT nécessiterait un nombre beaucoup plus grand d’entrées (256), chacune avec 32 octets, ce qui entraînerait une utilisation de 8 Ko de mémoire. Il est surprenant qu'AVX ne propose pas d'instruction pour simplifier ce processus, comme un magasin masqué avec emballage.

Solution AVX2

Malgré l'absence d'instruction dédiée , il est possible d'obtenir un emballage à gauche efficace dans AVX2 en utilisant une combinaison de techniques :

  • Utilisez vpermps pour variable-shuffle : _mm256_permutevar8x32_ps peut être utilisé pour effectuer un brassage variable de croisement de voies, permettant de regrouper les données en fonction du masque.
  • Générer des masques à la volée : BMI2 fournit l'instruction pext (Parallel Bits Extract), qui peut être utilisée pour extraire des bits du masque de saisie et générer le shuffle. contrôler les données.
  • Évitez pdep/pext sur les processeurs AMD : Les processeurs AMD antérieurs à Zen 3 ont une latence nettement plus élevée pour pdep et pext, des approches alternatives peuvent donc être nécessaires pour des performances optimales.

Algorithme

L'algorithme pour l'emballage à gauche AVX2 implique les étapes suivantes :

  1. Extraire les indices du masque de saisie à l'aide de pext.
  2. Décompressez les indices pour générer un masque de lecture aléatoire.
  3. Utilisez vpermps pour mélanger les saisir des données en fonction du mélange masque.

Conclusion

Cette approche fournit une solution très efficace pour l'emballage laissé dans AVX2. En utilisant vpermps, pext et d'autres instructions BMI2, il est possible de regrouper des données basées sur un masque avec une surcharge et une latence minimales.

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