Heim > Backend-Entwicklung > C++ > Wie können AVX2- und BMI2-Anweisungen das Left Packing basierend auf einer Maske optimieren?

Wie können AVX2- und BMI2-Anweisungen das Left Packing basierend auf einer Maske optimieren?

Barbara Streisand
Freigeben: 2024-12-30 13:45:13
Original
471 Leute haben es durchsucht

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

Verwendung von AVX2 und BMI2 für effizientes Left Packing basierend auf einer Maske

In AVX2 können wir die vpermps-Anweisung (_mm256_permutevar8x32_ps) zur Ausführung nutzen Spurwechsel-Variablenwechsel. Darüber hinaus stellt uns BMI2 pext (Parallel Bits Extract) zur Verfügung, wodurch wir bitweise Extraktionsoperationen durchführen können, die für unser Problem entscheidend sind.

Algorithmus:

  1. Beginnen Sie mit eine Konstante mit gepackten 3-Bit-Indizes ([7 6 5 4 3 2 1 0]).
  2. Gewünschte Indizes mit Pext in eine zusammenhängende Sequenz extrahieren.
  3. Eine Maske generieren, in der jedes Bit einem Indexbyte entspricht (Indizes einen pro Byte entpacken).
  4. Replizieren Sie jedes Bit in der Maske, um das entsprechende Byte zu füllen.
  5. Gewünschte Indizes aus dem Identitäts-Shuffle extrahieren mit pext.
  6. Konvertieren Sie die Indexbytes in eine 32-Bit-Ganzzahl.
  7. Verwenden Sie vpermps, um den Shuffle basierend auf dem 32-Bit-Indexvektor durchzuführen.

Code Implementierung:

#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);
}
Nach dem Login kopieren

Vorteile:

  • Verwendet unmittelbare Konstanten und vermeidet Speicherlasten.
  • Einfachheit und Effizienz.

Nachteile:

  • Kann auf AMD-CPUs vor Zen 3 aufgrund der langsamen pdep/pext-Leistung langsamer sein.

Das obige ist der detaillierte Inhalt vonWie können AVX2- und BMI2-Anweisungen das Left Packing basierend auf einer Maske optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage