网站建设入什么科目,如何在百度做自己公司的网站,seo怎么优化关键词排名,网站建设企业有哪些内容NEON指令
按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。
正常指令#xff1a;生成大小相同且类型通常与操作数向量相同到结果向量。长指令#xff1a;对双字向量操作数执行运算#xff0c;生产四字向量到结果。所生成的元素一般是操作数元素宽度到…NEON指令
按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。
正常指令生成大小相同且类型通常与操作数向量相同到结果向量。长指令对双字向量操作数执行运算生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍并属于同一类型。L标记如VMOVL。宽指令一个双字向量操作数和一个四字向量操作数执行运算生成四字向量结果。W标记如VADDW。窄指令四字向量操作数执行运算并生成双字向量结果所生成的元素一般是操作数元素宽度的一半。N标记如VMOVN。饱和指令当超过数据类型指定到范围则自动限制在该范围内。Q标记如VQSHRUN
指令的格式理解
NEON指令中有的加q有的不加q有何区别
操作符后的q如vmulq, 表示128位满位宽寄存器运算 v后的q如vqrdmulhq表示饱和运算溢位后为自动限制在数据类型的最大范围内。 rdmul表示向量与标量进行加倍乘运算的具体操作意义。 hq表示高位饱和lq表示低位饱和。
int16x8_t vqaddq_s16 (int16x8_t, int16x8_t)和int16x4_t vqadd_s16 (int16x4_t, int16x4_t)中vqaddq_s16和vqadd_s16各个字段的解释如下
第一个字母’v’指明是vector向量指令也就是NEON指令 第二个字母’q’指明是饱和指令即后续的加法结果会自动饱和 第三个字段’add’指明是加法指令 第四个字段’q’指明操作寄存器宽度为’q’时操作QWORD, 为128位未指明时操作寄存器为DWORD为64位 第五个字段’s16’指明操作的基本单元为有符号16位整数其最大表示范围为-32768 ~ 32767 形参和返回值类型约定与C语言一致。
其它助记符包括:
l 长指令数据扩展 w 宽指令数据对齐 n 窄指令, 数据压缩
NEON变量的命名规则
没有统一的规则如果想要规范些可采用以下命名方式。变量类型 变量名vTNnVar
解释
v表示向量运算 T表示变量的类型分别用s表示有符号整型u表示无符号整型f表示浮点 N表示变量元素所占位宽如s32,u16,f32中的数字即N表示元素占位 n表示向量线元素结构如x4x4x2 Var表示变量自定义的名字 vld1 格式
Result_t vld1_type(Scalar_t* N); Result_t vld1q_type(Scalar_t* N);
这个指令的作用是从内存加载到向量中 例子
vld1q_u16
是一个 ARM NEON 指令用于加载一组连续的 16 位无符号整数uint16_t值到一个 128 位的 NEON 寄存器。从内存中读取连续的 8 个 16 位无符号整数值并将它们存储到一个 NEON 寄存器中。ptr 是一个指向这些值的内存地址的指针
uint16_t *src image_src;
uint16x8_t vsrc;
vsrc vld1q_u16(src);
vdup_n 格式
vdup_n_type(Scalar_t N)将标量值 N 复制到一个 64 位的 NEON 向量寄存器中并将其扩展为给定类型的元素。vdupq_n_type(Scalar_t N)将标量值 N 复制到一个 128 位的 NEON 向量寄存器中并将其扩展为给定类型的元素
这个指令的作用是创建一个具有相同值的向量其中每个元素都等于给定的标量值。例如如果使用 VDUPQ_N 指令将标量值 5 复制到一个 128 位的 NEON 向量寄存器中那么该向量的每个元素都将被设置为 5。使用 VDUPQ_N 指令可以方便地初始化向量寄存器生成常量向量或将标量值扩展为向量形式。这对于需要对向量中的每个元素执行相同操作的情况非常有用并且可以提高数据处理的效率 例如
uint16x8_t q0 vdupq_n_u16(UINT16_MAX);//初始化创建
vst1格式
void vst1_type(Scalar_t* N, Vector_t M); void vst1q_type(Scalar_t* N, Vector_t M); 存储向量到内存 例子 uint8x8_t v; // define v as a vector with 8 lanes of 8-bit data
unsigned char A[8]; // allocate memory for eight 8-bit data
v vcreate_u8(0x0102030405060708); // create a vector that contains the values
// 1,2,3,4,5,6,7,8
vst1_u8(A, v); // store the vector to memory, in this case, to array A arm_neon.h 支持的操作 add 加法 mul 乘法 sub 减法 mla 乘加 mls 乘减 ceq 比较类似与 cge 比较类似与 cle 比较类似与 cgt 比较类似与 clt 比较类似与 tst 做与运算后判断是否等于0 ,ri (ai bi ! 0) ? 1…1:0…0; abd 两个向量相减后的绝对值vabd - ri |ai - bi|; max 求最大值ri ai bi ? ai : bi; min 求最小值ri ai bi ? bi : ai; shl 左移位 ri ai b; shr 右移位 ri ai b; abs 求绝对值ri |ai|; neg 取反ri -ai; mvn 按位取反ri ~ai; and 与运算ri ai bi; orr 或运算ri ai | bi; eor 异或运算ri ai ^ bi; cls 计算连续相同的位数 get 取值从向量中取出一个值所谓的向量可以认为是一个数组给数组中的某个元素赋值 set 赋值给向量中赋值 dup 构造一个向量并赋上初始值ri a; combine 合并操作把两个向量合并 mov 改变数据类型数据范围比如把u8 变成u16或者u16变成u8 zip 压缩操作 uzp 解压操作 ld1 加载数据给定的buffer 指针中拷贝数据注意是ld后面的是数字1而不是字母l st1 拷贝数据将neon数据类型拷贝到指定buffer中
指令查询表