neon指令

https://github.com/tpoisonooo/how-to-optimize-gemm/blob/master/aarch64/output_MMult_4x4_10.m 所用neon指令记载


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、NEON是什么

非ARM架构的CPU通常不支持NEON指令集。NEON是ARM架构专有的SIMD(单指令多数据)指令集扩展,专门设计用于ARM的处理器,如Cortex-A系列和Cortex-R系列等。NEON指令集是特定于ARM处理器的优化技术。

NEON是ARM架构的一个扩展部分,旨在为多媒体处理、信号处理和数值计算等应用提供更高的性能。它允许处理器一次性处理多个数据点,显著提高数据并行处理能力。
因为NEON是ARM专有的,所以只有运行ARM架构的处理器才会包含并支持NEON指令集。

二、指令部分

2.1 float32x4_t

float32x4_t 是 ARM NEON 指令集中的一种数据类型,用于表示一个包含四个单精度浮点数(32位浮点数)的向量。这种数据类型广泛用于 SIMD(单指令多数据)运算,通过并行处理多个数据元素来加速计算。

2.2 register

register float 是一种早期的 C 语言用法,表示希望将变量存储在处理器的寄存器(register)中,而不是在内存中,以提高访问速度和运算效率。这种用法在现代编译器中已经较少使用,但理解它对掌握计算机底层优化有一定帮助。

2.3 vld1q_f32

  • 全称:Vector Load 1 Quad Floating-Point 32-bit

  • 解释:
    v:表示这是一个向量(vector)操作。
    ld1:代表“Load 1”,表示从内存中加载数据。
    q:代表“Quad”,表示 128 位宽度,即加载 4 个 32 位的数据元素。
    f32:表示数据类型为 32 位浮点数(float32)。

  • 功能:从内存中加载 4 个连续的单精度浮点数到一个 128 位的 NEON 寄存器中。

2.4 vaddq_f32

  • 全称:Vector Add Quad Floating-Point 32-bit

  • 解释:
    v:表示这是一个向量(vector)操作。
    add:表示“Add”,即加法运算。
    q:代表“Quad”,表示 128 位宽度,即操作 4 个 32 位的数据元素。
    f32:表示数据类型为 32 位浮点数(float32)。

  • 功能:对两个 128 位的 NEON 寄存器中的 4 个单精度浮点数元素进行逐元素加法运算,结果存储在另一个 128 位寄存器中。

  • vld1q_f32:从内存加载 4 个单精度浮点数到 NEON 寄存器。

  • vaddq_f32:对两个包含 4 个单精度浮点数的向量进行逐元素加法。

  • 语法:
    float32x4_t vaddq_f32(float32x4_t a, float32x4_t b);
    参数说明
    a:第一个输入向量,类型为 float32x4_t,包含四个 32 位单精度浮点数(float)。
    b:第二个输入向量,类型为 float32x4_t,同样包含四个 32 位单精度浮点数(float)。
    返回值
    返回一个 float32x4_t 类型的向量,包含两个输入向量 a 和 b 的逐元素相加的结果。

2.5 vmlaq_n_f32

  • 全称:Vector Multiply-Accumulate Quad by Scalar Floating-Point 32-bit

  • 解释:
    v: 表示向量(Vector)操作。
    mla: 表示乘加操作(Multiply-Accumulate),即执行乘法并加上累加值。
    q: 表示 128 位的四元操作(Quad),意味着该操作涉及 4 个元素的向量。
    _n: 表示该操作是将向量中的每个元素与一个标量(scalar)相乘。
    f32: 表示数据类型是 32 位浮点数(float32)。

  • 功能:vmlaq_n_f32 用于对四个单精度浮点数组成的向量执行乘加运算。它将向量中的每个元素与一个给定的标量相乘,然后将结果累加到另一个向量上。

  • 语法:
    float32x4_t vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t n);
    参数:
    a:第一个向量(累加向量),用于接收最终的累加结果。
    b:第二个向量,其元素将与标量相乘。
    n:标量值,与 b 中的每个元素相乘。
    返回值:
    返回一个 float32x4_t 类型的向量,包含乘加运算后的结果。

2.6 vst1q_f32

  • 全称:Vector Store 1 Quad Floating-Point 32-bit

  • 解释:
    v:表示这是一个向量(Vector)操作。
    st1:代表“Store 1”,表示存储操作,把数据从 NEON 寄存器写入内存。
    q:代表“Quad”,表示 128 位的四元操作,即存储 4 个 32 位的数据元素。
    f32:表示数据类型为 32 位浮点数(float32)。

  • 功能:
    vst1q_f32 将 NEON 寄存器中包含的四个单精度浮点数(float32x4_t 类型)存储到指定的内存地址中。

  • 语法:
    void vst1q_f32(float32_t *ptr, float32x4_t val);

  • 参数:
    ptr:指向内存地址的指针(float32_t *),用于存储向量的起始位置。需要确保该地址有足够的空间存储 4 个浮点数。
    val:要存储的向量(float32x4_t 类型),包含 4 个 32 位单精度浮点数。


总结

neon指令

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值