原理
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
6.2.9.2 软件预取
原理
数据预取通过将代码中后续可能使用的数据提前加载到cache中,为后续代码的执行提前准备好数据,减少CPU等待数据从内存中加载的时间,提升cache命中率,进而提升整体软件的运行效率。预取指令格式通常如下:
PRFM prfop, [Xn|SP{, #pimm}]
prfop:由type<target><policy>三部分组成:
type可选模式有:
PLD:数据预加载 PLI:指令预取 PST:数据预存储
<target>可选模式有:
L1、L2、L3,分别表示对三个不同的cache层级进行操作
<policy>可选模式有:
KEEP:数据预取使用后保存一定时间,适用于数据多次使用的场景
STRM:流式或非临时预取,数据使用后将淘汰,用于仅使用一次的数据
Xn|SP:通常表示64位通用寄存器或栈指针,使用场景中通常为预取的起始地址
pimm:以字节为单位的偏移量,代表预取的字节长度,取值为8的整数倍,范围是0到32760,默认为0。预取长度可结合实际业务场景设定,尝试预取不同长度数据,获取最佳预取值。
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
6.2.9.2 软件预取
原理
数据预取通过将代码中后续可能使用的数据提前加载到cache中,为后续代码的执行提前准备好数据,减少CPU等待数据从内存中加载的时间,提升cache命中率,进而提升整体软件的运行效率。预取指令格式通常如下:
PRFM prfop, [Xn|SP{, #pimm}]
prfop:由type<target><policy>三部分组成:
type可选模式有:
PLD:数据预加载 PLI:指令预取 PST:数据预存储
<target>可选模式有:
L1、L2、L3,分别表示对三个不同的cache层级进行操作
<policy>可选模式有:
KEEP:数据预取使用后保存一定时间,适用于数据多次使用的场景
STRM:流式或非临时预取,数据使用后将淘汰,用于仅使用一次的数据
Xn|SP:通常表示64位通用寄存器或栈指针,使用场景中通常为预取的起始地址
pimm:以字节为单位的偏移量,代表预取的字节长度,取值为8的整数倍,范围是0到32760,默认为0。预取长度可结合实际业务场景设定,尝试预取不同长度数据,获取最佳预取值。