首頁 >後端開發 >C++ >如何使用 AVX2 和 BMI2 進行基於動態遮罩的高效左包裝?

如何使用 AVX2 和 BMI2 進行基於動態遮罩的高效左包裝?

Patricia Arquette
Patricia Arquette原創
2024-12-20 01:49:10787瀏覽

How Can AVX2 and BMI2 Be Used for Efficient Left Packing Based on a Dynamic Mask?

基於AVX2 和BMI2 的遮罩有效打包左元素

在AVX2 中,實現高效的左打包需要利用特定的指令和技術。一種方法是利用 AVX2 的 vpermps (_mm256_permutevar8x32_ps) 進行車道交叉變數改組,並利用 BMI2 的 pext(平行位擷取)進行位元運算。

利用BMI2 進行遮罩產生

BMI2 的pext 指令啟用從位元遮罩中擷取特定位,提供即時動態產生車道交叉洗牌控制數據的機制。這消除了對大型預先計算的查找表 (LUT) 的需要。

演算法

演算法涉及:

  1. 擷取壓縮索引:使用pext,產生壓縮位元遮罩,在整數暫存器的低位元中包含所需的通道索引。
  2. 解壓縮壓縮索引:為了解壓縮壓縮索引,使用了一系列移位和乘法。此步驟有效地複製每個位元以填充其相應的字節,從而創建每個位元組索引掩碼。
  3. 產生隨機播放遮罩: 使用每位元組索引遮罩計算隨機播放遮罩。然後使用此遮罩來使用 vpermps 控制車道交叉變數洗牌操作。

效能注意事項

這種方法的優點在於它能夠動態產生車道交叉洗牌掩碼,避免創建和儲存大型 LUT。這種方法在掩碼輸入是動態的情況下可能是有利的。然而,值得注意的是,在 Zen 3 之前的 AMD CPU 上,pdep/pext 操作可能相對較慢,因此 128 位元向量或基於 LUT 的方法等替代方法可能更適合此類架構。

以上是如何使用 AVX2 和 BMI2 進行基於動態遮罩的高效左包裝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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