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
Barbara Streisandoriginal
2024-12-30 13:45:13456parcourir

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);
}

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!

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