在开发算法的过程中会需要使用neon进行算法加速,记录自己学习neon的笔记
开始
1.关于armv8 neon的编程环境简单介绍
1.1寄存器环境, 指令的语法
armv8 寄存器介绍:
- 31x64-bit的通用寄存器X0/X8/X16/X24;总共是X0到X30(31个)每个是64bit
- 32x128-bit的向量寄存器V0/V8/V16/V24,每组都是8个,每个都是128 bit
stack pointer
Zero registers
V0-V31(总计32x16bytes的数据)寄存器的数据是可以以不同的形式pack 的,16bytes or 8bytes;称之为lanes; mul v0.u8, v0.u8, v1.u8
1.2.指令集
指令的语法
- 代表数据的类型(signed, unsigned, float, poly)[ S U F P]
- 代表的是指令的操作,例如[mul] [add]
- 指定具体的目标函数, 例如pairwise operations
- 数据包的形式,[8B, 16B, 4H, 8H, 2S, 4S, 2D],B=byte, H=halfword(16 bit), S=wors(32-bit), D=double(64-bit)
1.3.编写代码和调试
要想编写自己的程序现在好需要知道更多的指令的含义,能够调试代码,在指令不支持的情况下怎么实现功能。
- 数据类型 uint8x8_t,uint8x16_t, float32x4_t, float64x2_t
- 数据加载和存储 vld_u8(uint8_t*), vst_u8(uint8_t*, uint8x8_t)
- 算数运算 vadd_u8(uint8x8_t, uint8x8_t)
- 数据类型转换 vcvt_f32_u32(uint32x32_t)
- 更多的类型包括 移动寄存器数据 压缩函数 Lane 函数
2.编程例子
2.1.内联函数
使用neon环境搭建
#include “arm_neon.h” gcc -march=armv8-a
使用嵌入式汇编的写法虽然较为难入门,但是它实现的方式上更加的灵活,是不是也更加的高效率呢? 并不会直接的看出来使用哪些操作去优化代码,但是可以通过objdump和gdb去反汇编查看获得灵感。嵌入汇编的书写形式如下:
2.2.嵌入汇编
1 gcc -test.c -pg -o test
2 ./test
3 gprof ./test gmon.out
|