- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一系列 C++ 信号处理类,它们使用 32 位 float 作为它们的主要样本数据类型。例如,所有振荡器类都会为每个请求的样本返回 float 。这对所有类都是一样的,所有样本的计算都是 float 。
我正在将这些类移植到 iOS 中。对于性能问题,我想在 8.24 定点运行以充分利用处理器,据说在 iOS 上处理整数而不是 float 具有主要的性能优势。 . 我目前在 float 中进行所有计算,然后在输出前的最后阶段转换为 SInt32,这意味着最后阶段的每个样本都需要转换。
我是否只是将类中使用的数据类型从 Float 更改为 SInt32。所以我的振荡器和滤波器等通过在内部传递 SInt32 而不是 float 来计算固定点?
真的这么简单吗?还是我必须完全重写所有不同的算法?
在执行此任务之前,我还需要了解其他巫术吗?
非常感谢任何抽出时间对此发表评论的人..非常感谢..
最佳答案
这基本上是一个神话。如果在 Thumb 模式下为 armv6
编译,浮点性能过去会很慢;这在支持 Thumb 2 的 armv7
中不是问题(我将避免进一步讨论 Xcode 不再支持的 armv6)。您还希望避免使用 double ,因为 float 可以使用更快的 NEON(又名高级 SIMD 指令)单元——这很容易不小心发生;尝试启用 -Wshorten
。
我也怀疑您在执行 8.24 乘法时是否会获得明显更好的性能,尤其是在使用 NEON 单元时。更改 float
int
/int32_t
/SInt32
也不会自动执行 8.24 乘法所需的移位。
如果您知道将 float 转换为整数比较慢,请考虑使用 Accelerate.framework 中的一些函数,即 vDSP_vfix16()或 vDSP_vfixr16()。
关于c++ - float 到 SInt32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327194/
我有这个架构: 当我尝试推送 id = 6661883440 的新文档时,出现此错误: SEVERE: org.apache.solr.common.SolrExce
我有一个字符串格式的函数f(t,u,v);例如't^2 * sint + u*(20 + t) + v*t'。 如何解决这个问题? 我尝试这样做: t = Symbol('t') u = mu v =
我需要使用C语言中的64位变量来实现操作。尽管如此,嵌入式系统仅允许不超过32位的操作。 例如,也许我需要将64位变量拆分为32位,应用该操作,然后将值返回64位。 请检查以下伪代码: 函数Add()
作为tile,如何在Chisel3中以正确的方式将UInt转换为SInt值?IG: val opC = RegInit(0.U(64.W)) val result = RegInit(0.U(6
我是一名优秀的程序员,十分优秀!