【问题标题】:IEEE floating point vs custom float performanceIEEE 浮点与自定义浮点性能
【发布时间】:2013-01-10 05:08:09
【问题描述】:

我正在开发一个没有浮点单元的处理器,因此我必须为用户界面使用固定或自定义浮点类型。

这三种类型的乘法性能如何:
1. IEEE 浮点数 (32)
2. 具有 16 位有符号值和有符号 16 位指数的自定义 32 位浮点类
3. 32位固定十进制

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

任何帮助将不胜感激!

【问题讨论】:

  • 如果你想与使用硬件浮点的处理器兼容,你真的别无选择,是吗?否则,您已经将它们从慢到快列出。您的软类型(3 种中的任何一种)都将比硬件类型慢。
  • 与硬件实现相比,软 IEEE 浮点数相当慢。我不清楚浮动的其他表示形式会快得多。例如my C# implementation 需要大约 38 个时钟周期来进行加法/乘法运算。

标签: c++ floating-point fixed-point


【解决方案1】:

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

  • 输入中的+/-无穷大
  • 输入中的非数字
  • +/-0 输入
  • 输入中的规范化与非规范化数字以及尾数中的隐式“1”
  • 开箱打包
  • 规范化/非规范化
  • 不足和溢出检查
  • 正确的舍入,可能导致额外的(反)规范化和/或下溢/上溢

如果您将上述内容粗略计算为原始微操作的数量(列表中的每个项目为 1),您将接近 10。在最坏的情况下还会有更多。

因此,如果您对 IEEE 兼容的浮点运算感兴趣,预计每个模拟运算都比其对应的整数运算慢 30 倍(CodesInChaos 的评论是及时的,每次加法/乘法需要 38 个时钟)。

您可以通过以下方式选择浮点格式来偷工减料:

  • 只有一个零
  • 没有非数字
  • 仅限标准化数字
  • 尾数中没有隐含的“1”
  • 指数和尾数各占整数字节
  • 无或原始舍入
  • 可能,没有无穷大
  • 可能是 2 的补码尾数
  • 可能没有指数偏差

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

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

编辑:有关更简单的浮点格式的示例,请查看MIL-STD-1750A's 32-bit floating point format

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

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

十进制数十六进制表示法 (尾数 x Exp) 0.9999998 x 2127 7FFFFF 7F 0.5 x 2127 400000 7F 0.625 x 24 500000 04 0.5 x 21 400000 01 0.5 x 20 400000 00 0.5 x 2-1 400000 法郎 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

【讨论】:

  • 这些废话有什么意义?程序员在不检查整数的情况下做得很好,速度比检查是否超出范围更重要(显然,每次操作 10 次),如果需要安全,您可以自己检查,就像使用整数一样。
  • 好吧,我想你必须检查指数部分是否超量,才能使其始终如一地工作。不知道还有什么。
  • @RyanBrown 其中大部分都非常有用。它们使实现更复杂,但不一定更慢。例如,尾数中的隐式 1 简化了大多数操作。请记住,浮点数是为硬件实现而设计的,而不是为软件仿真而设计的。
  • 即使在简单的情况下,您也需要进行多次检查。除了加法/减法之外,您不能像使用 2 的补码整数那样只加/减两个数字。您需要对齐尾数并调整指数,您需要考虑符号,然后是加法/减法本身,然后您需要标准化结果的尾数并再次调整 exp 并可能将结果设置为 0当结果的大小太小而无法以格式表示时。仅此一项将使浮点加/减比 2 的补码整数加/减慢约 10 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2012-01-06
  • 2014-10-18
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多