首頁 >後端開發 >C++ >如何使用 AVX2 將 8 個字元從記憶體載入到 __m256 變數作為打包單精度浮點數?

如何使用 AVX2 將 8 個字元從記憶體載入到 __m256 變數作為打包單精度浮點數?

DDD
DDD原創
2024-10-31 21:43:02782瀏覽

How to Load 8 Characters from Memory into an __m256 Variable as Packed Single Precision Floats Using AVX2?

將8 個字元從記憶體載入到__m256 變數中作為打包單精確度浮點數

在高斯模糊演算法中,可以實現優化以加快執行速度透過有效地將資料載入到向量暫存器中。其中一種最佳化涉及用 __m256 變數取代浮點數組。本文利用 AVX2 指令的強大功能,為此任務提供了最佳解決方案。

使用AVX2 指令的解決方案

有效地將8 個字元從記憶體載入到__m256 變數中使用AVX2,以下指令是建議:

VPMOVZXBD  ymm0,  [rsi]  ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

指令細節

  • VPMOVZXBD:將ymm0 暫存器中的8 位元字元零擴充為32 位元整數。
  • VCVTDQ2PS:轉換 32 位元將整數轉換為打包單精確度浮點數,直接將它們儲存在 ymm0 中。

其他最佳化

要進一步最佳化此流程,請考慮使用廣播負載來提供高 64 位元的 VPMOVZXBD 指令和 Vpshufb 指令。此策略減少了整體uop 計數,提高了效率:

<code class="pseudocode">__m256 b = [float(new_image[x+7]), float(new_image[x+6]), ... , float(new_image[x])];
__m256 b = _mm256_broadcast_ss(&new_image[x])
_mm256_shuffle_epi8(b, _mm256_set1_epi8(0)); // fills upper 64 bits with zeroes
_mm256_cvtps_epu32(b); // convert to integers
_mm256_cvtepu32_ps(b); // convert back to floats</code>

避免次優技術

  • 避免使用多個128 位元或256 位元載入和後續的洗牌,因為它可能會引入不必要的瓶頸。
  • 不要使用VPMOVZXD 指令後面跟著 VPMOVZX 的單獨記憶體運算元,因為它會導致程式碼產生不理想。

其他注意事項

  • 考慮使用安全的內部函數,如果可用,以避免記憶體對齊或存取未初始化的潛在問題
  • 使用適當的_mm_loadl_epi64 或_mm_loadu_si64 內在函數以避免載入超出必要的資料或導致潛在的分段錯誤。

以上是如何使用 AVX2 將 8 個字元從記憶體載入到 __m256 變數作為打包單精度浮點數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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