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

Do any vector registers use same exponent bits for single and double precision?

可以将一对 32 位单精度浮点数存储在同一个 space 中,这将由一个 64 位双精度数采用。比如SSE2指令集的XMM寄存器,可以存储4个单精度数或者2个双精度数。

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

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

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

据我所知,没有人这样做。与整体构建 FPU 执行单元的晶体管成本相比,Sign-extending 和 zero-extending 在硬件上是微不足道的。

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


AFAIK,所有现代到足以拥有 SIMD 的 CPU 都使用 IEEE-754 格式,因为这是人们想要的,没有令人信服的理由不这样做。当然,其中绝大多数使用标准格式。

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

Do any actual vector instruction sets use the same number of exponent bits for single and double precision?

我不知道。但是,如果您不一定需要向量,x87 硬件就可以做到这一点。硬件比双精度还要多,内部格式是80位,15位指数,64位尾数。

FPU 有一个控制寄存器,用 3 种可能的值指定精度,32、64 或 80 位。当设置为 32 位时,每条指令舍入尾数并截断指数,使 ±INF 或零。

现代编译器不再发出这些指令,而是使用 SSE 向量寄存器的最低通道。

the circuit design should be simpler if you deviate from the IEEE standard and make both use the same number of exponent bits.

确实如此。这正是英特尔在 1980 年推出其 8087 FPU 的原因,整个芯片只有 45k 个晶体管。

然而,现代 CPU 有数十亿个晶体管的预算。设计的简单性不再是重中之重;性能和功耗。

说到性能,8087 花费多达 200 个周期来划分两个浮点数。我当前的 CPU (AMD Zen2) 最多花费 10 个周期来划分 32 位浮点数(一次 8 个),最多 13 个周期来划分 64 位浮点数(一次 4 个)。 200 个周期的巨大改进,但代价是复杂性和晶体管数量。