首頁  >  文章  >  後端開發  >  如何將 8 個字元作為打包單精度浮點數載入到 __m256 變數中?

如何將 8 個字元作為打包單精度浮點數載入到 __m256 變數中?

Patricia Arquette
Patricia Arquette原創
2024-11-03 13:21:30567瀏覽

How to Load 8 Chars into an __m256 Variable as Packed Single Precision Floats?

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

為了優化高斯模糊演算法,您尋求用__m256 內在變數取代浮點緩衝區的使用。本問題旨在確定此任務的最佳指令。

AVX2 架構說明:

  • 利用 PMOVZX 將字元零擴充為 32 位元256b 暫存器中的整數。
  • 使用 VCVTDQ2PS 就地轉換為浮點數。
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

其他策略:

  • 考慮使用128 位元廣播負載來提供高64 位元vpmovzxbd ymm,xmm 和 (pshu mmmmmmmm _mm256_shuffle_epi8)。這種方法減少了 uop 數量,對 Ryzen CPU 很有好處。
  • 避免使用額外的 shuffle 指令,因為當 shuffle 已經成為限制時,它們可能會成為瓶頸。

AVX1 架構說明:

  • 執行下列步驟:

    VPMOVZXBD   xmm0,  [rsi]
    VPMOVZXBD   xmm1,  [rsi+4]
    VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
    VCVTDQ2PS   ymm0, ymm0     ; convert to packed float
執行下列步驟:

執行以下步驟
    內在註意事項:
  • GCC 和MSVC 可能需要特殊處理,以確保在使用VPMOVZXBD ymm,[mem] 的內部函數時產生最佳程式碼。
  • 考慮使用 _mm_loadl_epi64 內部函數,它可以折疊到在 GCC 版本 9 及更高版本上使用 GCC 在 -O3 處實現最佳 asm 的內存操作數。
對於僅限 AVX1 的最佳化,編寫內在函數版本是一項無趣的練習。

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

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