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


9

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

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

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

我一直认为定点计算仅在CPU能力有限的情况下使用-在不考虑CPU能力的情况下使用定点计算有意义吗?


您真的需要双精度浮点值所提供的〜15个有效数字吗?虽然广义的总结很不好,但是我想说,如果您查看所有定点DSP系统的总和,则16位整数可能是最常见的格式。
杰森R

Answers:


7

如果整数分辨率更好,则整数的数字精度将仅优于浮点数的数字精度。双打有52个小数位,所以双精度浮点值具有比周围的整数的分辨率恶化,这比32768(大得多2 15)。因此,不,如果使用整数,数值精度将不会更好。252215

第二个问题是速度。答案是:它取决于硬件。如果您在具有多个定点乘法/累加核的数字信号处理器上运行程序,则可以,定点速度会更快。另一方面,在x86芯片上,它的定点速度可能会变慢。我完全按照您的意思做了一次,发现执行时间增加了。

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

如果要加快处理速度,可以将其从双精度浮点数更改为单精度浮点数。那会大大提高速度。当然,那会降低数值精度。


我的意思是我写我的时候这个答案怎么说。这个比较好。如果我没记错的话,我也在某些计算机上读到某个地方(也许是64位?),本机硬件浮点类型为double,因此使用单精度(四字节)浮点数实际上可能会更慢。无论如何,这是要考虑的事情。
heltonbiker 2012年

精度浮点数有23位尾数,双精度数有52位。
Paul R

我建议使用16位整数+ 48位分数作为双精度浮点的替代方法。我提到32768表示我的值很容易适合这个范围。考虑到这些值的限制,我认为Q16.48将提供比双精度浮点更高的数值精度。
nibot 2012年

1
@nibot好的。从-16到+16,双精度将具有更好的精度,而小数整数在-32769和+32768处的精度更高。当然,他们不能代表任何其他东西。他们也将比双打慢。对我来说,有限的射程和缓慢的速度会破坏交易,但是YMMV。
吉姆·克莱

6

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

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

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


2
+1表示缓存问题对性能的重要性。在现代x86处理器上,在设计算法时要考虑到缓存,这会对性能产生巨大影响。
杰森R

5

首选单精度浮点数加倍-这将使您的内存带宽,缓存占用空间和存储要求减半,并使某些数学运算更快。如果需要进一步的优化,这也开辟了4路SIMD的可能性。

只有在没有FPU的情况下,固定点才真正值得-大多数现代x86 CPU有两个FPU,因此使用固定点没有任何好处,使用固定点可能会导致性能大大降低。(还请注意,与浮点运算相比,定点运算需要更多指令,例如乘法。)


我有兴趣提高数值精度,而不是降低数值精度。
nibot 2012年

您如何看待定点相对于具有52位精度和巨大动态范围的双精度数提高了数字精度?
Paul R

好吧,我可以使用超过52位的定点格式。
nibot 2012年

由于显然您的定点表示形式的整数部分至少需要16位,这将使您远远超过64位,因此您可能正在寻找一种格式,而您的CPU甚至没有任何本机整数指令。在这种情况下,您最好只使用现有的大整数库或类似的库。不过,最重要的问题是:您真正需要多少精度?
Paul R

3

除了此处提供的非常好的答案外,还有一些值得补充的内容:

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

1

需要考虑的几点:

  • 多数现代处理器多年来一直在优化浮点数运算,甚至GPU已经非常成功地用于该运算。
  • 定点计算会损害您的数据,并且在算术运算条件不佳时可能导致严重的问题(这就是为什么将定点数替换为浮点数的原因);
  • 即使您使用带符号的短裤来容纳数据(很多数据记录器使用16位精度),计算也应以浮点数形式进行,然后再转换回整数,否则可能会出现诸如量化和混叠之类的假象。

最后,我认为我们的现实世界数据是宝贵的,而计算机的盲目数字运算是一项不起眼的琐事。必须让计算机为您和您的数据进行繁重的工作,并且不应将其视为节目中的真正明星。


我并不是要暗示我将使用16位短裤来容纳我的数量,而是某种类似于64位定点格式的东西,其中包含16位整数部分和48位小数部分。这样做的动机是,如果我仍然不使用浮点格式的大多数指数位,那么如果我改用那些位来提供额外的有效数字,我的数字精度会提高吗?
nibot 2012年

215

还有一件事:在我看来,StackOverflow(而不是DSP.SE,这里)将是了解一种格式优于另一种格式优缺点的理想场所。
heltonbiker 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.