我有一系列使用32位浮点数作为其主要样本数据类型的c++信号处理类。例如,所有振荡器类都会为所请求的每个样本返回浮点数。所有类均相同,所有样本计算均以浮点数表示。
我正在将这些类移植到iOS ..对于性能问题,我想在8.24定点上进行操作以充分利用处理器,可以这么说,iOS在处理整数而不是浮点数方面具有主要的性能优势。 m当前以浮点数进行所有计算,然后在输出之前在最后阶段转换为SInt32,这意味着需要转换最后阶段的每个样本。
我是否只需将类中使用的数据类型从Float更改为SInt32。因此,我的振荡器和滤波器等通过在内部传递SInt32而不是float来在固定点进行计算?
真的这么简单吗?还是我必须完全重写所有不同的算法?
在执行此任务之前,我还需要了解其他的伏都教徒吗?
非常感谢任何有空的人对此发表评论。.非常感谢..
最佳答案
这主要是一个神话。如果在Thumb模式下为armv6
进行编译,则浮点性能曾经很慢;这在支持Thumb 2的armv7
中不是问题(我将避免进一步讨论Xcode不再支持的armv6)。您还希望避免使用 double ,因为浮点数可以使用速度更快的NEON(又称“高级SIMD指令”)单元-这很容易意外发生;尝试启用-Wshorten
。
我还怀疑通过进行8.24乘法运算会获得明显更好的性能,尤其是在使用NEON单元的情况下。更改float
int
/ int32_t
/ SInt32
也不会自动进行8.24乘法的必要移位。
如果您知道将浮点数转换为整数是慢速位,请考虑使用Accelerate.framework中的某些函数,即vDSP_vfix16()或vDSP_vfixr16()。