定点与浮点计算的相对优点?

信息处理 固定点
2021-12-29 14:20:01

我有一个使用双精度浮点数在快速 x86 机器上运行的数字信号处理系统我突然想到,我并没有真正使用浮点表示的巨大动态范围——所有数量都很容易适应 ±32768 的范围。

我的问题:切换到定点计算是否有可能在数值精度(高优先级)或计算时间(低优先级)方面带来好处?

当然,答案取决于有多少位可用于定点计算。典型的定点系统使用多少位精度?是否可以在 x86-64 上 使用 64 位( 16 位整数部分,48 位小数部分)有效地进行定点计算?

我一直认为定点计算只在 CPU 能力有限的情况下使用——在不关心 CPU 能力的情况下使用定点计算是否有意义?

4个回答

如果整数分辨率更好,整数的数值精度只会比浮点数的数值精度更好。双精度浮点数有 52 个小数位,因此双精度浮点数的分辨率比整数差252, 远大于 32768 (215)。所以,不,如果你去整数,数值精度不会更好。

第二个问题是速度。答案是:这取决于硬件。如果您在具有多个定点乘法/累加内核的数字信号处理器上运行程序,那么是的,它在定点上会快得多。另一方面,在 x86 芯片上,它实际上在定点上可能会更慢。我做了你所说的一次,看到我的执行时间增加了。

在互联网上进行了一些搜索后,我发现这很常见。原因是它有一个专用的浮点处理器,当你转换到定点时它什么都不做,而定点硬件与常规的定点操作共享,例如指针运算。

如果要加快处理速度,方法是从双精度浮点数更改为单精度浮点数。这应该会显着提高速度。当然,这会降低您的数值准确性。

定点的优点主要是在功率方面(比如当你有处理器硬件的选择,或者处理器擅长关闭未使用的功能单元时)。这是因为对于给定的技术和操作问题率,定点单元通常比浮点单元更小(晶体管更少、电线更短、每个 MAC 需要克服的电容更少)。

然而,大量常见的当代处理器(服务器、PC 甚至移动)具有比整数乘法器更多和更快的 FPU(尤其是单精度 FP 单元),并且大部分系统功率不是来自使用 FPU,因此使用固定-point 对于这些产品上的典型 DSP 计算几乎没有优势,并且在纯粹的性能方面可能是劣势。使用当前技术,定点的任何优势都将主要体现在微型嵌入式产品中,例如按钮大小的设备。

但是,还要考虑内存和处理器缓存占用空间。巧妙地使用较小的数据类型(short int 和 float)以完全适应数据缓存中的大型计算可能会抵消任何纯 FPU 带宽优势。

更喜欢单精度浮点数而不是双精度浮点数 - 这将使您的内存带宽、缓存占用空间和存储需求减半,并使一些数学运算更快。如果需要进一步优化,它还开辟了 4 路 SIMD 的可能性。

仅当您没有 FPU 时,定点才真正值得 - 大多数现代 x86 CPU 有两个 FPU,因此使用定点没有任何好处,使用定点时性能甚至可能会明显变差。(另请注意,与浮点相比,定点需要额外的指令来进行乘法等运算。)

除了这里提供的非常好的答案之外,还有一些值得补充的事情:

  • 在某些情况下,即使您对处理的数据的动态范围有非常基本的要求,您仍然需要对其执行的某些操作具有非常好的精度 - 例如,您需要应用 IIR 滤波器需要相对较小的系数;截断它们会导致不稳定。一旦你的系统有反馈,当使用定点时,量化/截断问题很有可能会咬你一口——你必须更加小心滤波器拓扑和截断/分数保存方案等问题。
  • 与许多 DSP/DSC 架构不同,x86 没有饱和整数运算(嗯,它存在于 SSE 中,而不是标准标量代码中)。这意味着在溢出的情况下,可能会发生不好的事情 - 值改变符号和“包装”。您必须格外小心溢出和动态范围,或对操作数范围进行洒水测试遍及你的代码。这会严重影响性能。相比之下,浮点对这些问题更有弹性,因为大的动态范围给你更多的“空间”,溢出不会导致灾难性的故障。大多数在台式计算机上运行的音频信号处理代码都使用 -1.0 .. 1.0 范围,单精度或双精度;所以这提供了超过数百 dB 的动态余量。我已经用这两种方法编写了音频信号处理代码,当使用浮点时,只有少数地方我必须明确地剪辑/饱和信号 - 通常只是在信号处理链的末端或发生反馈的地方。