Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Arahan AVX2 dan BMI2 Boleh Melaksanakan Pembungkusan Kiri Berdasarkan Topeng dengan Cekap?

Bagaimanakah Arahan AVX2 dan BMI2 Boleh Melaksanakan Pembungkusan Kiri Berdasarkan Topeng dengan Cekap?

Susan Sarandon
Lepaskan: 2024-12-29 19:34:11
asal
249 orang telah melayarinya

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

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

  1. Buat pemalar dengan indeks 3-bit yang dibungkus mewakili pilih atur yang diingini.
  2. Gunakan pdep untuk mengekstrak indeks yang berkaitan daripada mask.
  3. Buka bungkusan indeks kepada satu setiap bait.
  4. Tukar indeks yang tidak dibungkus kepada topeng kawalan untuk vpermps.
  5. Lakukan kocok pembolehubah menggunakan vpermps.

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan