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 :
Algorithme
L'algorithme pour l'emballage à gauche AVX2 implique les étapes suivantes :
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!