如果我尝试使用arm数学汇编程序命令而不是c,我会获得性能加值吗?

tes*_*der 4 c assembly android arm

我在我的应用程序中循环,执行数学乘法和加法计算.

我知道一些事实:

  • android设备支持armv6及以上处理器
  • armv6不支持NEON命令

我是否会提高armv6上的应用程序性能,包括和更高,如果不是c数学命令,我将开始使用汇编程序数学命令?

UPDATE

我需要更快地执行数学运算循环,是使用汇编程序而不是c的正确方法.

UPDATE

我有这个计算:

Ry0 = (b0a0 * buffer[index] + b1a0 * Rx1 + b2a0 * Rx2 - a1a0 * Ry1
                    - a2a0 * Ry2);
Run Code Online (Sandbox Code Playgroud)

它是双二阶传递函数.

我能用asm强制执行这个计算吗?

UPDATE

  • 缓冲区大小是192000
  • 变量是浮点类型

Mat*_*son 12

编译器非常擅长他们的工作,所以除非你知道你的编译器正在生成什么,并且知道你可以做得更好,可能不会.

如果不确切知道代码的作用,就不可能给出更好的答案.

编辑:总结一下这个讨论:提高性能的第一步不是开始编写汇编程序.第一步是找到最有效的算法.完成后,您可以查看汇编程序编码.


Eri*_*hil 8

无限脉冲响应(IIR)功能难以以高性能实现,因为每个输出元件紧密依赖于前一个输出元件.这迫使从输出到输出的延迟.此依赖关系链违背了常见的高性能技术(例如SIMD,条带挖掘和超标量执行).

最初在装配中工作不是一个好方法.在某些时候,在装配工作可能会有所帮助.但是,您有一个需要解决的基本问题:在完成上一个输出,乘以系数并添加额外算术的结果之前,不能生成新的输出.因此,使用此配方可以做到的最好的事情就是产生一个输出,因为处理器可以从头到尾进行乘法和加法,甚至假设其他工作可以并行完成.

在数学上可以重写IIR,以便输出在过去进一步依赖于其他输出和输入,而不是前一个输出.这使用了更多算术,但提供了并行执行更多算术的可能性,从而获得更高的吞吐量.

在iPhone或其他iOS设备上,您只需在Accelerate框架中调用vDSP_deq22即可.Accelerate是Apple库,因此在Android上不可用.然而,也许有人已经实现了类似的东西.

一种方法是测量每个输出采用的处理器周期数(计算多个,按输出数除以时间,乘以处理器速度)到周期的延迟,从加法乘法(来自处理器模型的文档)您正在使用).如果所花费的时间与延迟相同,则无法在该处理器上更快地执行此算法,您必须接受它或找到具有不同数学运算的替代解决方案.