ARMv8 NEON 教程(一)

本文详细介绍了ARMv8 AArch64架构下的NEON向量处理教程,涉及C语言实现、基本操作指令、功能汇总以及汇编指令语法。通过实例演示了如何使用NEON进行浮点数乘法运算,适合ARM开发者深入理解向量处理技术。
摘要由CSDN通过智能技术生成

ARMv8 NEON 教程(一)

该教程只针对:ARMv8 AArch64
(AArch 64 指ARMv8独有的一种执行状态: ARM Architecture 64 bit)

一、 快速开始

C语言代码: neon_quick_start.c

/********************************************
*          E2MCC wrote the code				*
*********************************************/
#include <stdio.h>
#include <arm_neon.h> //head file for neon

int main(int argc, char ** argv)
{	
	/***************************************
	* C[0] = A[0] * B[0]
	* C[1] = A[1] * B[2]
	* C[2] = A[2] * B[2]
	* C[3] = A[3] * B[3]
	****************************************/
	//general
	float A[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
	float B[6] = {2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
	float C[5] = {0};
	
	//neon
	float32x4_t neon_A;
	float32x4_t neon_B; 
	float32x4_t neon_C = vdupq_n_f32(0);//set all 4 lane to ZERO

	//neon load:  neon <-- general 
	neon_A = vld1q_f32(A);
	neon_B = vld1q_f32(B);
	
	//neon compute: 
	neon_C = vmulq_f32(neon_A, neon_B);
	
	//neon store: neon --> general
	vst1q_f32(C, neon_C);
	
	//C will be {2.0, 6.0, 12.0, 20.0, 0.0}
	for(int i=0;i<5;++i)
		printf("C[%d]=%.1lf\n",i,C[i]);

	return 0;
}

编译:

gcc -std=c99 neon_quick_start.c -o neon_quick_start.out

运行:

./neon_quick_start.out

二、NEON功能汇总

可通过 ARM官方neon指令文档 查询。以下给出neon关键功能标识以方便查找:

功能名关键标识全称
读取ldload
存储ststore
加法addaddite
减法subsubtract
乘法mulmultiply
除法divdivide
乘加mlamultiply and add
乘减mlsmultiply and subtract
绝对值absabsolute
平方根sqrtsquare root
比较cmpcompare
条件选择cselcondition select
最大maxmaxium
最小minminium

三、Neon指令语法(AArch64)

以下是neon的汇编指令,我们一般用不到,但是也需要能看懂。

[prefix][op][suffix]  Vd.[T],  Vn.[T],  Vm.[T]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值