NEON指令加速

NEON是一种基于SIMD思想的技术,能够基于单条指令对多个数据同时进行操作,其使用的NEON指令类似于Intel CPU下的MMX/SSE/AVX指令,通过向量化的计算方式优化应用程序性能,通常应用于图像处理、音视频处理、数据并行处理等需要大量计算场景。

NEON技术依赖于128位NEON寄存器的硬件支持,NEON寄存器是一种向量寄存器,一个寄存器中可存储多个数据元素,但要求其具有相同的数据类型。

以下是ARMv8-A中AArch64架构下的寄存器:

使用编译器能力自动向量化加速

原理

编译器支持自动向量化功能,其会自动利用NEON属性,编译时将代码向量化。启用自动向量化功能前需要打开相应的编译选项,且并非所有代码均可向量化,其需要符合一定的编码方式和规律,以提供更多的提示信息给编译器,进一步触发编译器进行代码的向量化。

支持该特性的编译器有:GCC、LLVM、适用于嵌入式和Linux项目的ARM编译器。

修改方式:

使用NEON intrinsic加速提升性能

原理

NEON intrinsic函数是一系列C函数调用,编译器可将其替换为适当的NEON指令或NEON指令序列。NEON intrinsic函数几乎提供与编写NEON汇编指令相同的功能,但是将寄存器分配等工作留给编译器,以便开发人员可以专注于算法开发。与使用NEON汇编指令编码相比,NEON intrinsic方式的代码有更好的可维护性。ARM编译器、GCC和LLVM编译器都支持NEON intrinsic。

修改方式

在使用NEON intrinsic函数时需要增加头文件#include <arm_neon.h>,详细的NEON intrinsic函数列表和使用方法,可参考NEON Intrinsic Reference:https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics