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:
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); }
Vorteile:
Nachteile:
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!