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