当前位置: 首页 > article >正文

neon指令

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

文章目录

  • 前言
  • 一、NEON是什么
  • 二、指令部分
    • 2.1 float32x4_t
    • 2.2 register
    • 2.3 vld1q_f32
    • 2.4 vaddq_f32
    • 2.5 vmlaq_n_f32
    • 2.6 vst1q_f32
  • 总结


前言


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

一、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指令


http://www.kler.cn/news/294137.html

相关文章:

  • 【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务
  • 奇异递归模板模式(Curiously Recurring Template Pattern)
  • 未雨绸缪:环保专包二级资质续期工程师招聘时间策略
  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
  • TYPE-C USB设计
  • [数据集][目标检测]轮胎检测数据集VOC+YOLO格式4629张1类别
  • 等保测评:如何构建安全的远程工作环境
  • 工作:GX WORKS标签的分类
  • Seata环境搭建
  • Unity TMP (TextMeshPro) 更新中文字符集
  • IDEA取消自动选择光标所在行
  • go面试:说一下 GMP 模型的原理
  • 关于IDEA的快捷键不能使用的原因
  • jQuery基础——Ajax
  • 如何免费将视频转换为 MP4?将视频转换为 MP4 的 5 种方法
  • Linux——redis主从复制、哨兵模式
  • Java程序分析工具
  • Python 操作大数据使用 Hadoop
  • Unity3D在2D游戏中获取触屏物体的方法
  • 做运营,发布时间很重要
  • Android Studio更新代码可正常运行但IDE报红
  • 【保姆级教程】使用 PyTorch 自定义卷积神经网络(CNN) 实现图像分类、训练验证、预测全流程【附数据集与源码】
  • 【量化部署】AWQ in MLSys 2024
  • 如何查找 Docker 容器的 IP 地址 ?
  • #include <iostream>介绍
  • Linux日志-journal日志
  • 【uni-app】通过 HBuilderX 创建 uni-app vue3项目
  • 2024年架构设计师论文-“模型驱动架构设计方法及其应用”
  • 【MATLAB】矩阵的合并
  • 编程技术开发105本经典书籍推荐分享