首頁 >後端開發 >C++ >如何最有效地使用 AVX2 進行帶有面罩的左包裝?

如何最有效地使用 AVX2 進行帶有面罩的左包裝?

Patricia Arquette
Patricia Arquette原創
2024-12-22 16:39:10655瀏覽

How Can AVX2 Be Used Most Efficiently for Left Packing with a Mask?

左包裝問題

考慮有一個輸入數組和一個輸出數組,但只需要滿足某些條件的元素的情況寫入輸出數組。使用 AVX2 實現此目的最有效的方法是什麼?

SSE 方法

SSE 方法涉及使用_mm_movemask_ps 從輸入掩碼中提取4 位元掩碼,然後使用此掩碼透過_mm_load_si128 產生隨機播放控制資料。最後,使用 _mm_shuffle_epi8 來排列值以對齊 SIMD 暫存器前面的有效元素。此方法適用於具有 16 項查找表 (LUT) 的 4 寬 SSE 向量。

AVX 限制

但是,對於8 寬AVX向量,LUT 將需要大量的條目(256),每個條目有32 位元組,從而導致8k 的內存使用量。令人驚訝的是,AVX 沒有提供簡化此過程的說明,例如帶包裝的蒙面商店。

AVX2 解決方案

儘管缺乏專門的說明,可以使用以下組合在AVX2 中實現高效的左打包技巧:

  • 使用vpermps 進行變數洗牌: _mm256_permutevar8x32_ps 可用於執行跨車道變數洗牌,允許根據遮罩打包資料。
  • 動態產生遮罩: BMI2 提供了 pext(並行位擷取)指令,可用於從輸入遮罩中擷取位元並產生隨機控制資料。
  • 在AMD CPU 上避免使用pdep/pext: AMD Zen 3 之前的CPU 的pdep 和pext 延遲明顯更高,因此可能需要替代方法才能達到最佳效果

演算法

AVX2中的左打包演算法涉及以下步驟:

  1. 從輸入中提取索引使用 pext 進行遮罩。
  2. 解壓縮索引以產生隨機播放mask。
  3. 使用 vpermps 根據 shuffle mask 對輸入資料進行 shuffle。

結論

這種方法提供了一種高效的解決方案用於 AVX2 中的左包裝。透過利用 vpermps、pext 和其他 BMI2 指令,可以以最小的開銷和延遲基於遮罩打包資料。

以上是如何最有效地使用 AVX2 進行帶有面罩的左包裝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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