首頁 >後端開發 >C++ >AVX2和BMI2指令如何基於遮罩優化左包裝?

AVX2和BMI2指令如何基於遮罩優化左包裝?

Barbara Streisand
Barbara Streisand原創
2024-12-30 13:45:13449瀏覽

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

使用AVX2 和BMI2 基於掩碼進行高效左打包

在AVX2 中,我們可以利用車道vpermps (_mm256_permute8x32_ps交叉可變洗牌。此外,BMI2 為我們提供了 pext(平行位提取),使我們能夠執行對我們的問題至關重要的位元提取操作。

演算法:

  1. 開始儲存壓縮 3 位元索引的常數 ([7 6 5 4 3 2 1 0])。
  2. 使用 pext 將所需索引提取到連續序列中。
  3. 產生一個掩碼,其中每一位對應一個索引位元組(每個位元組解包一個索引)。
  4. 複製掩碼中的每個位元以填充其對應的位元組。
  5. 使用以下方法從身分洗牌中提取所需的索引pext。
  6. 將索引位元組轉換為 32 位元整數。
  7. 使用 vpermps 基於 32 位元索引向量執行 shuffle。

代碼實現:

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

優點:

  • 使用立即常量並避免內存負載。
  • 簡單和

缺點:

  • 由於pdep/pext 效能較慢,在Zen 3 之前的AMD CPU 上可能會較慢。

以上是AVX2和BMI2指令如何基於遮罩優化左包裝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn