Neon / RPi上的64位DSP过滤性能优化

如何解决Neon / RPi上的64位DSP过滤性能优化

我在Analog Devices Sharc DSP处理器上有一个32位C ++ DSP音频处理项目,需要将其移至64位处理,这已经有一段时间了,可用于ARM AArch64的嵌入式用例。

我正在考虑两种选择:

  • 使用我自己的FIR和IIR过滤的自定义实现,或者
  • 使用一些针对AArch64和Neon优化的库函数

除64位精度外,我还进行了大量cpu密集型处理。我还需要获得更多的处理能力,因为当前Sharc性能也是一个瓶颈。 IIR和FIR功能应提供基于块的64位实时信号处理。

我的目标平台是RaspBerry Pi,可能是3B +。4。例如,我提供了我需要的功能。在CMSIS库中以arm_biquad_cascade_df2T_f64()的形式出现(它实际上与补充的init函数一起使用,该函数实现以基于块的方式处理数据所需的状态数组)。而且库函数似乎可以与64位一起使用。但是我怀疑它们是否适合AArch64,并针对AArch64进行了优化,因为通常CMSIS也被标记为32位Ne10。

我正在探索自定义代码路径,我的问题是:

  • 什么类型的Neon和AArch64特定的优化是可能的
  • 与基于块的biquad函数的普通C实现相比,可以预期达到哪种性能提升

或者仅由编译器优化和使用Neon就足够了吗?

解决方法

如果您有选择,那么就性能而言,您肯定会选择AArch64而非32位Neon实现。 AArch64具有更多/更广泛的矢量寄存器。由于AArch64放弃了普遍存在的32位指令集的条件执行,CPU会从乱序执行中获得更多收益,这很容易通过条件标志引起指令之间的额外依赖。

我最近从一个特定的优化任务中得出的个人结论:

  • 与gcc相比,clang的自动矢量化效果更好
  • clang 10的自动矢量化效果优于clang 8
  • clang对特定Cortex内核的调优令人印象深刻
  • 有用的clang标志:-Rpass=loop-vectorize -Rpass-missed=loop-vectorize -Rpass-analysis=loop-vectorize
  • 两个编译器都未能克服AArch64矢量收集负载的不足
  • 手动矢量化的代码仍然比自动矢量化性能高2倍
  • 使用索引不足的文档阻碍了使用ARM向量内在函数进行编程,并且ARM将所有向量指令从ARMv7重命名为AArch64
  • 使用llvm-mca(https://llvm.org/docs/CommandGuide/llvm-mca.html),非常有用

请记住,这些经验不应该被宽泛地概括,这是一项特定的任务。

通过手动优化的实现方式可获得多少性能取决于自动矢量化程序是否可以使用特定的纯C代码。

我从一个普通的C实现开始,将其自动矢量化,研究llvm-mca输出,发现自动矢量化代码的弱点,然后从那里开始工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?