ホームページ >バックエンド開発 >C++ >SSE、AVX、および AVX-512 を使用して倍精度浮動小数点と 64 ビット整数の間で効率的に変換するにはどうすればよいですか?

SSE、AVX、および AVX-512 を使用して倍精度浮動小数点と 64 ビット整数の間で効率的に変換するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 12:30:10360ブラウズ

How Can I Efficiently Convert Between Double-Precision Floats and 64-bit Integers Using SSE, AVX, and AVX-512?

SSE/AVX による Double/int64 変換

SSE2 命令セットは、単精度浮動小数点と 32 ビットの間でベクトルを変換するための組み込み関数を提供します。整数ですが、倍精度および 64 ビットには同等のものが存在しません。整数。 AVX にはこれらの変換もありません。

限定的な AVX512 サポート

AVX512 では、符号付きおよび符号なしの両方の 64 ビット整数との間の変換を行うための組み込み関数が導入されています。ただし、AVX2 以前の構成にはそのような機能がありません。

Int64 変換の近似

AVX2 以前の場合、uint64 と int64 間の倍精度変換をシミュレートする方法があります。特定の値範囲制限と丸め付き動作。

Fast Double <-> uint64_t 変換:

このメソッドは、[0, 2^52) の範囲内の値に対して機能します。マジック ナンバーを追加して上位ビットをマスクすることにより、double の uint64_t 表現の近似値を取得できます。

Fast Double <-> int64_t 変換:

uint64_t バージョンと同様に、この近似は [-2^51, 2^51] 内の値に対して機能します。

フルレンジ Int64 <- >二重変換:

uint64_t -> double:

このメソッドは 5 つの命令を使用して、int64 の全範囲を double として表します。

int64_t -> double:

この変換には 6 つの命令が必要で、最も近い表現可能な double に正しく丸められます。

結論

AVX512 は double を直接サポートします。 /int64 変換ですが、以前の構成の場合、提供された近似値は、特定の値の範囲と丸め動作を使用した効率的なソリューションを提供します。制約。

以上がSSE、AVX、および AVX-512 を使用して倍精度浮動小数点と 64 ビット整数の間で効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。