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

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

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

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

评论

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

#1 楼

如果整数分辨率更好,则整数的数字精度将仅优于浮点数的数字精度。双精度数具有52个小数位,因此双精度浮点型的分辨率比整数差,约为$ 2 ^ {52} $,远大于32768($ 2 ^ {15} $)。因此,不,如果使用整数,数值精度将不会更好。

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

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

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

评论


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

$ \ begingroup $
单精度浮点数有23位尾数,双精度浮点数有52位。
$ \ endgroup $
– Paul R
2012年10月29日在16:38



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

$ \ begingroup $
@nibot好的。从-16到+16,双精度将具有更好的精度,而小数整数在-32769和+32768处的精度更高。当然,他们不能代表其他任何东西。他们也将比双打慢。对我而言,有限的射程和缓慢的速度会破坏交易,但是YMMV。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
2012年10月29日在21:18



#2 楼

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

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

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

评论


$ \ begingroup $
+1提到了缓存问题对性能的重要性。在现代x86处理器上,在设计算法时要考虑缓存,这会对性能产生巨大影响。
$ \ endgroup $
–Jason R
2012年10月30日在1:09

#3 楼

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

固定点仅在没有FPU时才真正值得-大多数现代x86 CPU都有两个FPU,所以没有通过使用定点获得,使用定点可能会大大降低性能。 (还请注意,与浮点运算相比,定点运算需要更多指令,例如乘法。)

评论


$ \ begingroup $
我感兴趣的是提高数值精度,而不是降低数值精度。
$ \ endgroup $
–nibot
2012年10月29日19:57

$ \ begingroup $
您如何看待定点相对于具有52位精度和巨大动态范围的双精度数提高了数字精度?
$ \ endgroup $
– Paul R
2012年10月30日在22:18



$ \ begingroup $
好吧,我可以使用超过52位的定点格式。
$ \ endgroup $
– nibot
2012年10月31日在9:19

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

#4 楼

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


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


#5 楼

需要考虑的几点:


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

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

评论


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



$ \ begingroup $
您应该将16位整数+ 48位小数添加到原始问题中。好像$ 2 ^ {15} $引起了混乱。
$ \ endgroup $
–克里斯托弗·费尔顿(Christopher Felton)
2012年10月29日15:12



$ \ begingroup $
还有一件事:在我看来,StackOverflow(而不是DSP.SE)将是了解一种格式优于另一种格式优缺点的理想场所。
$ \ endgroup $
– heltonbiker
2012年10月29日15:26