SSE/AVX による効率的な Double/int64 変換
SSE2 には、単精度浮動小数点数と 32 ビット整数の間でベクトルを変換するための命令が用意されています、倍精度および 64 ビットに対応する組み込み関数整数がありません。 AVX でもこれらの変換は提供していません。
フォールバック手法
専用の命令がない場合、これらの変換をシミュレートする方法がいくつかあります。
- 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 の浮動小数点での加算が打ち消し合う可能性があるという事実を利用します。小数ビットを使用して、倍精度結果の正確な再構築を可能にします。
丸め動作
切り捨てられた変換メソッドは、ゼロに向かう丸めが負の無限大に向かう可能性があることを除いて、現在の丸めモードに従います。フルレンジ変換により、すべてのモードで正しい丸めが保証されます。
可用性
ここで紹介する手法は、SSE/AVX での直接 int64_t および double 変換の欠如に対する回避策を提供します。これらのメソッドは、変換が必要なコードの最適化に特に役立ち、効率と精度のバランスを実現します。
以上がSSE/AVX を使用して Double と int64 の間で効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。