Pelaksanaan AVX2 yang Cekap untuk Pembungkusan Ditinggalkan Berdasarkan Topeng
Tidak seperti SSE, AVX tidak mempunyai arahan khusus untuk pembungkusan yang ditinggalkan berdasarkan topeng. Walau bagaimanapun, gabungan arahan AVX2 dan BMI2 boleh digunakan untuk mencapai tugas ini dengan cekap.
Menggunakan AVX2 dan BMI2
Pendekatan memanfaatkan vpermps (arahan _mm256_permutevar8x32_ps), yang melakukan shuffle pembolehubah lintasan lorong, dan pdep (_pdep_u64) arahan daripada BMI2, yang menyediakan pengekstrakan bitwise.
Langkah Algoritma
Pelaksanaan Butiran
Kod di bawah menyediakan pelaksanaan dalam AVX2 BMI2:
#include <immintrin.h> __m256 compress256(__m256 src, unsigned int mask) { uint64_t expanded_mask = _pdep_u64(mask, 0x0101010101010101); // unpack each bit to a byte expanded_mask *= 0xFF; // mask |= mask<<1 | mask<<2 | ... | mask<<7; // ABC... -> AAAAAAAABBBBBBBBCCCCCCCC...: replicate each bit to fill its byte const uint64_t identity_indices = 0x0706050403020100; // the identity shuffle for vpermps, packed to one index per byte 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); }
Analisis Prestasi
Pelaksanaan ini melibatkan 6 uops dengan 16c kependaman. Ia berpotensi mengekalkan daya pemprosesan satu lelaran setiap 4 kitaran, mengekalkan berbilang lelaran dalam penerbangan.
Pendekatan Alternatif
Untuk CPU AMD sebelum Zen 3, pext/pdep adalah sangat perlahan, jadi pendekatan alternatif mungkin lebih baik. Untuk elemen 16-bit, pendekatan vektor 128-bit boleh digunakan. Untuk elemen 8-bit, teknik berbeza yang melibatkan berbilang ketulan bertindih boleh digunakan.
Atas ialah kandungan terperinci Bagaimanakah Arahan AVX2 dan BMI2 Boleh Melaksanakan Pembungkusan Kiri Berdasarkan Topeng dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!