IEEE 浮点与自定义浮点性能

IEEE floating point vs custom float performance

本文关键字:性能 自定义 IEEE      更新时间:2023-10-16

我正在研究没有浮点单元的处理器,所以我必须为用户界面使用固定或自定义浮点类型。

这三种类型的乘法性能如何:

  1. IEEE浮型 (32)
  2. 具有 16 位
  3. 有符号值和有符号 16 位指数的自定义 32 位浮点类
  4. 32 位固定十进制

我想要一些也可以扩展到带有浮点单元的处理器的东西,自定义浮点数在性能方面是否会与 IEEE 浮点数竞争? 我听说 IEEE 浮点数在没有 FPU 的处理器上很糟糕,是因为 24 位值不是本机值,它必须做疯狂和/或? 也就是说,自定义浮点类是否会缓解该性能问题?

任何帮助将不胜感激!

软件模拟的 IEEE 浮点数/双精度值很慢,因为需要检查并正确处理许多边缘情况。

  • 输入中的 +/-无穷大
  • 输入中的非数字
  • 输入 +/-0
  • 输入中的归一
  • 化与非归一化数字以及尾数中的隐式"1"
  • 开箱和包装
  • 规范化
  • /非规范化
  • 下溢和溢出检查
  • 正确的舍入,这可能导致额外的(去)规范化和/或下溢/溢出

如果你只是粗略地将上述操作算作一些原始的微操作(列表中的每个项目1),你会接近10。在最坏的情况下,还会有更多。

因此,如果您对IEEE编译浮点运算感兴趣,则期望每个模拟运算都比整数运算慢30倍(CodesInChaos的评论是及时的,每次加法/乘法38个时钟)。

您可以通过使用以下浮点格式来削减一些角落:

  • 只有一个零
  • 没有非数字
  • 仅规范化数字
  • 尾数中没有隐含的"1"
  • 指数和尾数各占整数字节数
  • 无舍入
  • 或基本舍入
  • 可能,没有无穷大
  • 可能,2的补体尾
  • 可能,没有指数偏差

定点运算可能会变得更高性能。但是它的常见问题是,您必须事先知道输入和中间结果的所有范围,以便选择正确的格式以避免溢出。您可能还需要支持许多不同的定点格式,例如 16.16、32.32、8.24、0.32。C++模板可能有助于减少此处的代码重复。

无论如何,你能做的最好的事情就是定义你的问题,用浮点和定点算法来解决它,观察两者中哪一个最适合哪个 CPU,然后选择获胜者。

编辑:有关更简单的浮点格式的示例,请查看MIL-STD-1750A的32位浮点格式:

 MSB                                         LSB MSB          LSB
------------------------------------------------------------------
| S|                   Mantissa                 |    Exponent    |
------------------------------------------------------------------
  0  1                                        23 24            31

浮点数表示为小数尾数乘以 2 的指数幂。在浮点运算开始时假定所有浮点数归一化或浮点为零,所有浮点运算的结果归一化(归一化浮点数具有尾数符号和下一个相反值的位)或浮点零。浮点零定义为 0000 0000 16,即零尾数和零指数 (0016)。扩展浮点零定义为 0000 0000 000016,即零尾数和零指数。32 位浮点数的机器表示形式的一些示例:

十进制数十六进制表示法 (尾数 x 经验) 0.99999998 x 2127 7FFFFF 7F 0.5 x 2127 400000 7楼 0.625 x 24 500000 04 0.5 x 21 400000 01 0.5 x 20 400000 00 0.5 x 2-1 400000 FF 0.5 x 2-128 400000 80 0.0 x 20 000000 00 -1.0 x 20 800000 00 -0.5000001 x 2-128 BFFFFF 80 -0.7500001 x 24 9FFFFF 04