我一直在分析我几乎完成的项目,我看到大约四分之三的 CPU 时间花在这个 IIR 过滤器功能上(目前在目标硬件上大约在一秒钟内调用了数十万次)因此,在其他一切正常的情况下,我想知道它是否可以针对我的特定硬件和软件目标进行优化。我的目标只有 iPhone 4 和更新版本,只有 iOS 4.3 和更新版本,只有 LLVM 4.x。如果有收获,一点点不精确可能是可以的。
static float filter(const float a, const float *b, const float c, float *d, const int e, const float x)
{
float return_value = 0;
d[0] = x;
d[1] = c * d[0] + a * d[1];
int j;
for (j = 2; j <= e; j++) {
return_value += (d[j] += a * (d[j + 1] - d[j - 1])) * b[j];
}
for (j = e + 1; j > 1; j--) {
d[j] = d[j - 1];
}
return (return_value);
}
任何有关加速它的建议都值得赞赏,如果可以在默认编译器优化之外进行优化,也对您的意见感兴趣。我想知道 NEON SIMD 是否会有所帮助(这对我来说是新的领域),或者是否可以利用 VFP,或者 LLVM 自动矢量化是否会有所帮助。
我尝试了以下 LLVM 标志:
-ffast-math(没有显着差异)
-O4(在 iPhone 4S 上有很大的不同,时间减少了 25%,但在我的最低目标设备 iPhone 4 上没有显着差异,改进是我的主要目标)
-O3 -mllvm -unroll-allow-partial -mllvm -unroll-runtime -funsafe-math-optimizations -ffast-math -mllvm -vectorize -mllvm -bb-vectorize-aligned-only (来自 Hal Finkel 幻灯片的 LLVM 自动矢量化标志:http://llvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdf,比 Xcode 发布目标的默认 LLVM 优化慢)
对其他标志、不同方法和功能更改开放。我宁愿单独留下输入和返回类型和值。实际上在这里讨论了使用 FIR 的 NEON 内在函数:https ://pixhawk.ethz.ch/_media/software/optimization/neon_support_in_the_arm_compiler.pdf但我没有足够的经验来成功应用信息我自己的情况。谢谢你的澄清。
编辑我很抱歉没有早点注意到这一点。在调查了 aka.nice 的建议后,我注意到为 e、a 和 c 传入的值始终是相同的值,并且我在运行前就知道它们,因此可以选择包含此信息的方法。