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

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

Patricia Arquette
發布: 2024-11-03 13:21:30
原創
610 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板