floating-point - 是否有向量寄存器对单精度和 double 使用相同的指数位?

标签 floating-point precision cpu-architecture sse simd

可以将一对 32 位单精度 float 存储在与 64 位 double 占用的同一空间中。例如,SSE2指令集的XMM寄存器,可以存储4个单精度数或2个 double 。

根据 IEEE 754 标准,单精度和 double 之间的区别不仅在于精度本身,还在于可用范围:分别为 8 和 11 指数位。

直观上,在我看来,如果你设计一个 FPU 来并行处理 2N 个单精度数或 N 个 double ,那么如果你偏离 IEEE 标准并让两者使用相同的标准,电路设计应该会更简单指数位数。例如,bfloat16 半精度格式,牺牲了一些尾数位以保持与单精度相同数量的指数位;对此给出的部分理由是,在 bfloat16 和单精度之间转换更容易。

任何实际的向量指令集是否对单精度和 double 使用相同数量的指数位?如果是这样,它们是否更接近单精度的典型 8 位,或者 double 的典型 11 位?

最佳答案

据我所知,没有人这样做。与构建 FPU 执行单元整体的晶体管成本相比,符号扩展和零扩展在硬件中相当微不足道。

与构建一个可以用作一个 52 位乘法器或 2 个单独的 23 位乘法器的乘法器相比,将指数与尾数位路由到它们需要的位置并不是什么大问题。 (这样,相同的晶体管可以用于打包单乘法和打包双乘法/FMA 的尾数;这是 FMA/乘法器单元的芯片面积的很大一部分。)


据我所知,所有足够现代、支持 SIMD 的 CPU 都使用 IEEE-754 格式,因为这就是人们想要的,并且没有令人信服的理由不这样做。当然,其中绝大多数都使用标准格式。

例如,ARM NEON 最初不支持完整的 IEEE 754,但他们遗漏了逐渐下溢(次正常)。他们仍然使用 IEEE binary32 和 binary64(标准浮点和 double )数据格式。

关于floating-point - 是否有向量寄存器对单精度和 double 使用相同的指数位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63859609/

相关文章:

c# - 从 int 转换为 float 的问题

python - 有人可以帮我解释这段将小数转换为二进制的代码吗?

python - Python的Decimal类是可变宽度的吗?

math - float 学有问题吗?

cpu-architecture - 了解内存模型

ios - SoundCloud iOS SDK 架构

javascript - 如何在 Javascript 中检查一个值是否是整数(特殊情况 1.0 应该是 float )

c - 如何在 C99 中获取带符号的 float 零?

assembly - Intel x86_64 汇编,如何在 x87 和 SSE2 之间移动? (计算 double 的反正切)

operating-system - 当条目被从 TLB 驱逐时更新页表