Maison > développement back-end > C++ > Comment les instructions AVX2 et BMI2 peuvent-elles optimiser l'emballage gauche en fonction d'un masque ?

Comment les instructions AVX2 et BMI2 peuvent-elles optimiser l'emballage gauche en fonction d'un masque ?

Barbara Streisand
Libérer: 2024-12-30 13:45:13
original
447 Les gens l'ont consulté

How Can AVX2 and BMI2 Instructions Optimize Left Packing Based on a Mask?

Utilisation d'AVX2 et BMI2 pour un emballage efficace à gauche basé sur un masque

Dans AVX2, nous pouvons exploiter l'instruction vpermps (_mm256_permutevar8x32_ps) pour effectuer mélanges variables de croisement de voies. De plus, BMI2 nous fournit du pext (Parallel Bits Extract), nous permettant d'effectuer des opérations d'extraction au niveau du bit cruciales pour notre problème.

Algorithme :

  1. Commencez par un maintien constant des indices 3 bits emballés ([7 6 5 4 3 2 1 0]).
  2. Extraire les indices souhaités dans une séquence contiguë à l'aide de pext.
  3. Générer un masque où chaque bit correspond à un octet d'index (décompresser les indices un par octet).
  4. Répliquer chaque bit du masque pour remplir son octet correspondant.
  5. Extraire les indices recherchés du mélange d'identité en utilisant pext.
  6. Convertissez les octets d'index en un entier de 32 bits.
  7. Utilisez vpermps pour effectuer la lecture aléatoire en fonction du vecteur d'index de 32 bits.

Code Implémentation :

#include <stdint.h>
#include <immintrin.h>

__m256 compress256(__m256 src, unsigned int mask)
{
  uint64_t expanded_mask = _pdep_u64(mask, 0x0101010101010101);
  expanded_mask *= 0xFF;
  const uint64_t identity_indices = 0x0706050403020100;
  uint64_t wanted_indices = _pext_u64(identity_indices, expanded_mask);

  __m128i bytevec = _mm_cvtsi64_si128(wanted_indices);
  __m256i shufmask = _mm256_cvtepu8_epi32(bytevec);

  return _mm256_permutevar8x32_ps(src, shufmask);
}
Copier après la connexion

Avantages :

  • Utilise des constantes immédiates et évite les charges de mémoire.
  • Simplicité et efficacité.

Inconvénients :

  • Peut être plus lent sur les processeurs AMD avant Zen 3 en raison de performances pdep/pext lentes.

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