首頁 > 後端開發 > C++ > 我們如何在 AVX2 中為 Intel 和 AMD 處理器高效實現 log2(__m256d)?

我們如何在 AVX2 中為 Intel 和 AMD 處理器高效實現 log2(__m256d)?

Mary-Kate Olsen
發布: 2024-11-27 15:49:10
原創
684 人瀏覽過

How Can We Efficiently Implement log2(__m256d) in AVX2 for Both Intel and AMD Processors?

AVX2 中log2(__m256d) 的高效率實作

SVML 的__m256d _mm256_log2_pd (__m256d a處理器) 僅限於「Intel」較慢。存在替代實現,但它們通常專注於 SSE 而不是 AVX2。本次討論旨在為四個雙精度數向量提供 log2() 的高效實現,該實現與各種編譯器兼容,並且在 AMD 和 Intel 處理器上均表現良好。

傳統策略

通常的方法利用公式log2(a*b) = log2(a) log2(b),此公式可簡化為指數log2(尾數) 對於雙數。尾數的範圍有限,為 1.0 到 2.0,因此適合透過多項式逼近來獲得 log2(尾數)。

準確度和精確度

所需的準確度和投入的範圍影響實作。 Agner Fog 的 VCL 旨在使用誤差避免技術實現高精度。但是,為了更快地近似float log(),請考慮JRF 的多項式實現(可在此處找到:http://jrfonseca.blogspot.ca/2008/09/fast-sse2-pow-tables-or-polynomials .html)。

VCL 演算法

VCL 的log float 和double 函數遵循兩部分方法:

  1. 提取指數和尾數:指數將轉換回浮點數,並透過檢查小於的值來調整尾數SQRT2*0.5。接下來從尾數減去 1.0。
  2. 多項式近似: 將多項式近似應用於調整後的尾數,以計算 x=1.0 附近的 log(x)。對於雙精度,VCL 使用兩個 5 階多項式的比率。

透過將指數加到多項式近似值來獲得最終結果。 VCL 包含額外的步驟來最小化舍入誤差。

替代多項式近似

為了提高準確性,您可以直接使用 VCL。然而,為了更快實現 float 的近似 log2(),請考慮使用 FMA 將 JRF 的 SSE2 函數移植到 AVX2。

避免捨入誤差

VCL 使用各種技術來減少捨入誤差。其中包括:

  • 將 ln2 拆分為更小的常數(ln2_lo 和 ln2_hi)
  • 加行 res = nmul_add(x2, 0.5, x);多項式評估

去除不必要的步驟

如果已知您的值是有限且正的,則可以透過註解掉以下檢查來顯著提高效能下溢、溢位或非正規。

進一步正在閱讀

  • [具有極小極大誤差的多項式逼近](http://gallium.inria.fr/blog/fast-向量化-math-approx/)
  • [使用位的快速近似對數操縱](http://www.machinedlearnings.com/2011/06/fast-approximate-logarithm-exponential.html)

以上是我們如何在 AVX2 中為 Intel 和 AMD 處理器高效實現 log2(__m256d)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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