开发者
资源
使用 NEON intrinsic 加速提升性能
使用 NEON intrinsic 加速提升性能
发表于2024/07/08
2362
原理 

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。预取长度可结合实际业务场景设定,尝试预取不同长度数据,获取最佳预取值。 

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞