【发布时间】:2021-01-14 20:15:35
【问题描述】:
我在 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 特定优化
- 与基于块的双二阶函数的纯 C 实现相比,可以预期的性能提升幅度
或者,留给编译器优化和使用 Neon 就足够了?
【问题讨论】:
-
你知道godbolt.org 吗?使用它来查看您的 C 实现将如何被优化。将编译器设置为最接近实际使用的 GCC,传递正确的标志。
-
你能编辑你在“Raspberry Pi”段落中的第二句话吗?很难跟上。
-
句子已编辑,谢谢
标签: c++ embedded-linux