简要介绍
NEON_2_SSE.h 是 Intel 官方在 Github 开源的一份代码,其基于 Intel 自身的 SSE 指令,对 Cortex-A 系列平台上的 NEON 浮点加速指令进行了模拟实现,非常有价值,具体有两点如下:
- 此前基于 Cortex-A 系列用 NEON 指令开发的代码,可以直接无缝切换,在 Windows&Intel 平台运行;
- 利用 ARM CMSIS DSP 开源代码,可以对普通的浮点代码进行一定程度加速,本文档便针对此进行些许讨论。做几组时延对比,实测性能表现;
其中,CMSIS(Common Microcontroller Software Interface Standard)是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。其中,CMSIS-DSP 为数字信号处理库函数。
而子模块 DSP ,它的统一接口函数支持主流的 ARM 指令,如:循环展开、DSP 指令、NEON 指令与 Helium加速指令,只要打开对应的宏便可,非常方便开发者使用。
源码地址
1、Intel 官方 Github 开源代码地址,除了本文介绍的 NEON_2_SSE.h ,还有很多优秀的代码实现:
2、ARM CMSIS-DSP 的官方链接地址:
3、ARM CMSIS-DSP的 Github 源码地址:
github.comgithub.com/ARM-software/CMSIS_5/tree/master
运行环境
项目 | 值 |
---|---|
编译器 | MSVC |
系统 | Windows 10 |
芯片 | Intel |
支持指令 | CPUZ 实测支持 SSE、SSE2等 |
线程 | 单线程 |
测量方法
1、以微妙级别统计时间函数 QueryPerformanceCounter 进行测量,官方介绍如下:
2、每次循环 1000000 次,取均值进行对比;
测量结果
注意:
- 每个人的测试环境一定不一样,这里给出的结果,大家可以看其相对值,有个大体概念;
- 精力有限,只测试常用的乘法与加法,其它如乘累加、偏移、标量乘等未测;
- 取四组长度,均为以2底的指数,因为信号处理领域FFT的缘故,经常出现此类长度;
乘法速度测试结果,单位微妙:
Mul | NEON2SSE | float | Int32 |
---|---|---|---|
512 | 1.3 | 1.4 | 1.3 |
2048 | 1.8 | 2.6 | 2.5 |
8192 | 3.9 | 6.8 | 7.3 |
32768 | 11.9 | 21.6 | 23.4 |
加法速度测试结果,单位微妙:
Add | NEON2SSE | float | Int32 |
---|---|---|---|
512 | 1.2 | 1.4 | 1.3 |
2048 | 1.4 | 2.5 | 2.4 |
8192 | 3.9 | 6.9 | 6.4 |
32768 | 11.9 | 21.7 | 22.2 |
测量结论
1、NEON_2_SSE.h 确实可以加速普通的浮点运算,建议使用;
2、多数场景下,定点32位与单精度浮点速度拉不开差距,应该还是因为 Intel 有很卓越的 FPU 协处理器的缘故;