使用 SSE/AVX 进行双精度/int64 转换
SSE2 指令集提供了用于在单精度浮点数和 32 位之间转换向量的内在函数整数,但双精度和 64 位整数不存在等效项。 AVX 也缺少这些转换。
有限的 AVX512 支持
AVX512 引入了用于与 64 位整数(有符号和无符号)相互转换的内在函数。但是,AVX2 及更早的配置缺乏此类功能。
近似 Int64 转换
对于 AVX2 及以下版本,有一些方法可以模拟双精度与 uint64 和 int64 之间的转换具有特定值范围限制和舍入行为。
快速双倍 uint64_t 转换:
此方法适用于 [0, 2^52) 范围内的值。通过添加一个幻数并屏蔽高位,您可以获得双精度数的 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中文网其他相关文章!