最近,Ne10 v1.2.0 发布了。该更新提供了一个新功能——基3、基5的快速傅立叶变换(FFT)。 在基准测试中可以看到, NEON优化使得FFT得到大幅的性能提升。
Ne10 项目旨在为ARM的生态系统提供高度NEON优化的基础函数,比如图像处理(Image Processing)、数字信号处理(DSP)和数学(math)函数等。想要更多地了解Ne10项目,请移步此博客。想更多地了解Ne10中的FFT功能,请移步此博客。
图1给出了在ARM v7-A(Cortex-A9, 1.0GHz)和AArch64 (Cortex-A53, 850MHz) 上,四个不同实现的性能数据,包括Ne10 (v1.2.0),pffft(2013),kissFFT(1.3.0),以及Opus项目 (v1.1.1-beta) 中的FFT实现(基于kissFFT,但经过优化)。其中kissFFT和Opus中的实现并没有利用NEON技术,而Ne10和pffft是经过深度的NEON优化的。编译器采用的是LLVM 3.5,编译选项是-O2。
图1
图1中,横坐标是FFT的长度,纵坐标是消耗的时间,时间越少说明性能越好。其中,循环次数是 2.048 x 106 / (FFT的长度)。举个例子,我们将1024点FFT执行2000次,然后记录下总运行时间。由于pffft要求FFT的长度是16的倍数,所以对应的曲线是从240开始的。可以看出,经过NEON优化后,性能得到明显的提升。
图2
图2给出了四种FFT实现的每秒百万次浮点操作数(MFLOPS)。计算方式参考此链接。横坐标是FFT的长度,纵坐标是MFLOPS。MFLOPS反映了不同算法求解同一问题时的性能,值越大说明性能越好。从图中可见,NEON指令把数据“打包”处理,大大提高了MFLOPS。
此次更新并没有改变FFT的API,Ne10在启动 (Initial/Setup)的过程中识别FFT的长度是否包含基-3、基-5,进而选择最优的计算方法。详情请参考此博客。