使用SSE/AVX 進行高效的Double/int64 轉換
而SSE2 提供了在單精度浮點數和32 位元整數之間轉換向量的指令,缺少雙精確度和64 位元整數的對應內在函數。即使 AVX 也不提供這些轉換。
回退技術
在沒有專門說明的情況下,有幾種方法可以模擬這些轉換:
使用一系列位元運算和移位,它是可以使用5 或6 條指令將uint64_t 或int64_t 轉換為double
- For values in specific ranges, using a shifted add and a bitwise XOR can convert double to uint64_t or int64_t in just two instructions. - Reversing these steps can perform the inverse conversions.
實現細節
實現細節
實現細節實現細節
實現細節實作轉換事實,[2^52, 2^53)範圍內的雙精確度浮點值有它們的最低尾數位與最低有效位對齊。透過新增特定遮罩值並執行位元運算,可以獲得整數表示。 全範圍轉換解決了符號擴展問題,並利用了 x86 上浮點加法可以抵消的事實小數位,能夠準確重建雙精度結果。 舍入行為The截斷轉換方法遵循當前舍入模式,但向零舍入可能向負無窮大捨入。全範圍轉換可確保所有模式的正確舍入。 可用性所提出的技術為 SSE/AVX 中缺乏直接 int64_t 和雙重轉換提供了解決方法。這些方法對於優化需要這些轉換的程式碼特別有用,可以在效率和準確性之間取得平衡。
以上是如何使用 SSE/AVX 在 Double 和 int64 之間有效率地轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!