可以将一对32位的单精度浮点数存储在64位双精度数字所取的相同空间中。例如,SSE2指令集的XMM寄存器可以存储四个单精度数字或两个双精度数字。
根据IEEE 754标准,单精度和双精度的区别不仅在于精度本身,而且在于可用范围:8和11指数位。
从直觉上看,如果你设计一个FPU来处理2N个单精度数字或N个并行双精度数字,那么如果你偏离IEEE标准并使两者都使用相同的指数位数,电路设计就应该更简单。例如,bfloat16半精度格式,交换一些尾数位以保持与单个精度相同的指数位数;给出的部分理由是,bfloat16和单个精度之间的转换更容易。
是否有任何实际的向量指令集使用相同的指数位数来实现单精度和双精度?如果是的话,它们是否更接近于单精度典型的8位,还是双精度典型的11位?
发布于 2020-09-12 11:16:49
AFAIK没人会这么做。与构建FPU执行单元的晶体管成本相比,数字扩展和零扩展在硬件上是相当微不足道的。
与构建一个乘法器相比,将指数和尾数位路由到需要去的地方并不是什么大不了的事情,你可以用它作为一个52位乘法器或两个单独的23位乘法器。(这样,同样的晶体管可以用于填充的单倍率和填充双乘法器/FMA;这是FMA/乘法器单元模具面积的很大一部分。)
AFAIK,所有的CPU都足够现代化,完全可以使用IEEE-754格式,因为这是人们想要的,没有令人信服的理由不这么做。当然,它们中的绝大多数都使用标准格式。
例如,ARM霓虹灯最初不支持完整的IEEE 754,但他们遗漏的是渐进式的下流(下流)。他们仍然使用IEEE binary32和binary64 (标准浮动和双)数据格式。
发布于 2020-09-13 18:36:18
是否有任何实际的向量指令集使用相同数量的指数位来实现单精度和双精度?
我不知道这件事。但是,如果您不一定需要矢量,x87硬件就是这样做的。硬件具有比双精度更高的位数,内部格式为80位,指数为15位,尾数为64位。
FPU有一个控制寄存器,它用3个可能的值指定精度,32,64或80位。当设置为32位时,每条指令都舍入尾数,并截断生成±INF或零的指数.
现代编译器不再发出这些指令,而是使用SSE向量寄存器的最低通道。
电路设计应该更简单,如果你偏离了IEEE标准,使两者都使用相同数量的指数位。
是的确实如此。这正是英特尔在1980年推出8087 FPU的原因,整个芯片只有45k个晶体管。
然而,现代CPU拥有数十亿晶体管的预算。简单的设计不再是优先考虑的问题了;性能和功耗是最重要的。
说到性能,8087花了多达200个周期来除以两个浮点数。我目前的CPU (AMD Zen2)花费多达10个周期来除以32位浮点数(8次),最多13个周期来除以64位浮点数(一次4次)。与200个周期相比有了巨大的改善,但代价是复杂性和晶体管的重要性。
https://stackoverflow.com/questions/63859609
复制相似问题