
NEON
文章平均质量分 95
NEON与VFP编程,arm平台性能优化必备技能之一。
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
TYYJ-洪伟
移动端技术主管、优快云博客专家。个人微信:tyyj89
展开
-
【ARMv8 SIMD和浮点指令编程】浮点数据转换指令——数据类型互转必备
浮点数据转换指令包括不同的浮点精度数之间的转换,还包括整型和浮点数之间的转化。在了解数据转换指令前,必须学习 IEEE 754 定义的五种舍入规则。原创 2023-12-09 07:33:58 · 1442 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 移动指令——精通 MOV?
移动指令主要涉及 MOV 和 MVN,它们分别是移动和求反移动。如果你认为仅仅两条指令,还是太小看设计者了!原创 2023-06-18 07:22:32 · 1071 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】浮点加减乘除指令——四则运算
浮点指令有专门的加减乘除四则运算指令,比如 FADD、FSUB、FMUL、FDIV 等。原创 2023-11-05 13:56:32 · 1069 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...
NEON 通用数据处理指令包括以下指令(不限于):• DUP将标量复制到向量的所有向量线。• EXT提取。反转向量中的元素。• TBL、TBX向量表查找。• TRN向量转置。• UZP、ZIP向量交叉存取和反向交叉存取。原创 2023-10-29 07:30:01 · 1347 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 存储指令——如何将数据从寄存器存储到内存?
和加载指令一样,NEON 有一系列的存储指令。比如 ST1、ST2、ST3、ST4。原创 2023-10-28 14:54:47 · 1691 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?
除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。原创 2023-09-30 07:10:46 · 905 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(LDx&LDxR)?
将内存中的数据搬到 NEON 寄存器,有很多指令可以完成,熟悉这些指令是必须的。原创 2023-09-30 07:00:50 · 1077 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——asimdrdm
ARMv8 有许多版本(ARMv8.1 等),它们定义了强制和可选功能。Linux 内核通过 hwcaps 公开了其中一些功能的存在。这些值显示在 /proc/cpuinfo 中。原创 2023-09-03 07:24:33 · 1269 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——乘法知多少?
NEON 乘法指令包括向量乘法、向量乘加和向量乘减,还有和饱和相关的指令。总之,乘法指令是必修课,在我们的实际开发中会经常遇到。原创 2023-08-27 17:05:18 · 1220 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 移位指令——左右移位之术
NEON 移位指令主要涉及逻辑移位、算术移位两大类,同时下面还介绍了两个移位插入指令。原创 2023-07-22 08:14:13 · 558 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 比较指令——比较的方方面面
比较指令是常见的一类指令,NEON 中当然也排除,下面涉及比较和测试位两类指令。原创 2023-06-22 07:20:22 · 896 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 逻辑指令——与或非有多少?
NEON 逻辑指令主要包括与、或、异或、位清除、或非、为 False 时按位插入、为 True 时按位插入和按位选择指令。原创 2023-06-10 07:43:37 · 1004 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】Libyuv I420 转 ARGB 流程分析
Libyuv 可以说是做图形图像相关从业者绕不开的一个常用库,它使用了单指令多数据流提升性能。以 ARM 处理为主线,通过 I420 转 ARGB 流程来分析它是如何流转的。原创 2023-01-01 10:03:34 · 2116 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】编程基础
ARM 高级 SIMD 架构、相关的实现和支持软件通常被称为 NEON 技术。AArch32(相当于 ARMv7 的 NEON 指令)和 AArch64 都有 NEON 指令集。两者都可以显著加速在大型数据集上的重复操作。这在媒体编解码器等应用中很有用。AArch64 的 NEON 架构使用 32 × 128 位寄存器,是 ARMv7 的两倍。这些寄存器与浮点指令使用的寄存器相同。原创 2023-02-14 08:05:12 · 1413 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 加法指令——加法都能玩出花
向量加法包括常见的普通加指令,还包括长加、宽加、半加、饱和加、按对加、按对加并累加、选择高半部分结果加、全部元素加等。如果你和我一开始以为的只有一种普通加,那就太小看设计者了!同时这么多加法指令的确会提升我们设计程序的效率,同样学习这些指令也需要花费不少精力。原创 2023-06-03 07:27:57 · 611 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 减法指令——减法也好几种
向量减法包括常见的普通加指令,还包括长减、宽减、半减、饱和减、按对减、按对加并累加、选择高半部分结果加、全部元素加等。原创 2023-06-04 06:43:12 · 482 阅读 · 0 评论 -
【ARMv8 SIMD和浮点指令编程】NEON 通用算术指令——杂项也不少
无符号向量差值绝对值累加和差值绝对值。向量绝对值和求反。无符号向量最大值,无符号向量最小值,无符号向量按对最大值,无符号向量按对最小值,无符号跨向量最大值和跨向量最小值。向量前导符号位计数,前导零计数和设置位计数。原创 2023-06-10 07:28:02 · 805 阅读 · 0 评论 -
【NEON 和 VFP 编程】优化时域滤波函数
时域滤波函数主要用在滤波上,去除时域噪声,经常应用在图像处理领域。因为时域滤波函数会使用窗口,不论是窗口内所有值累加以后做除法,还是做其他运算,都会成为消耗计算机CPU的“大户”,那么优化的首要目标就是加速这些部分。下面我们来看一下原版时域滤波函数。一、C++版本时域滤波函数以下是ImageFilter.h文件内容:class ImageFilter {public: Imag...原创 2019-11-27 07:54:16 · 558 阅读 · 0 评论 -
【NEON 和 VFP 编程】VFP 指令
本节包括以下小节:• VABS、VNEG 和 VSQRT浮点绝对值、求反和平方根。• VADD、VSUB 和 VDIV浮点加法、减法和除法。• VMUL、VMLA、VMLS、VNMUL、VNMLA 和 VNMLS浮点乘法和乘加,包含可选求反。• VCMP浮点数比较。• VCVT(在单精度数和双精度数之间)在单精度数和双精度数之间转换。• VCVT(在浮点数和整数之间)在浮点...原创 2019-11-25 08:04:32 · 1881 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON 和 VFP 系统寄存器
以下三个 NEON 和 VFP 系统寄存器可在所有 NEON 和 VFP 执行中使用:• FPSCR,浮点状态和控制寄存器• FPEXC,浮点异常寄存器•FPSID,浮点系统标识寄存器• 修改 NEON 和 VFP 系统寄存器的个别位。一、FPSCR,浮点状态和控制寄存器FPSCR 包含所有用户级 NEON 和 VFP 状态位及控制位。 NEON 仅使用位 [31:27]。这些位的用法...原创 2019-11-25 08:01:37 · 1649 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON 和 VFP 伪指令
伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。伪指令有2个特点:(1)由于是伪“指令”,因而它只存在于汇编语言中。高级语言中不叫指令,叫语句;(2)由于是“伪”指令,也即“假”指令,因而不是可执行指令...原创 2019-11-22 07:53:40 · 904 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON加载、存储元素和结构指令
本节包括以下小节:• 交叉存取。• 加载/存储元素和结构指令中的对齐限制。• VLDn 和 VSTn(单个 n 元素结构到一条向量线)。此类指令几乎可用于所有数据访问。可加载标准向量 (n = 1)。• VLDn(单个 n 元素结构到所有向量线)。• VLDn 和 VSTn(多个 n 元素结构)。一、交叉存取此组中的许多指令在将结构存储到内存时提供交叉存取功能,并在从内存加载结构时...原创 2019-11-20 07:58:41 · 701 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON乘法指令
本节包括以下小节:• VMUL{L}、VMLA{L} 和 VMLS{L}。向量乘法、向量乘加和向量乘减。• VMUL{L}、VMLA{L} 和 VMLS{L}(按标量)。向量乘法、向量乘加和向量乘减(按标量)。• VQDMULL、VQDMLAL 和 VQDMLSL(按向量或标量)向量饱和加倍乘法、向量乘加和向量乘减(按向量或标量)。• VQ{R}DMULH(按向量或标量)返回高半部...原创 2019-11-19 07:49:53 · 1959 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON通用算术指令
本节包括以下小节:• VABA{L} 和 VABD{L}向量差值绝对值累加和差值绝对值。• V{Q}ABS 和 V{Q}NEG向量绝对值和求反。• V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL 和 VSUBW向量加法和减法。• V{R}ADDHN 和 V{R}SUBHN选择高半部分的向量加法和选择高半部分的向量减法。• V{R}HADD 和 VHSUB向量...原创 2019-11-17 21:07:42 · 913 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON移位指令
本节包括以下小节:• VSHL、VQSHL、VQSHLU 和 VSHLL(按立即数)按立即值左移。• V{Q}{R}SHL(按有符号变量)按有符号变量左移。• V{R}SHR{N}、V{R}SRA(按立即数)按立即值右移。• VQ{R}SHR{U}N(按立即数)按立即值右移并进行饱和。• VSLI 和 VSRI左移并插入,右移并插入。一、VSHL、VQSHL、VQSHLU 和...原创 2019-11-13 08:36:41 · 1101 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON通用数据处理指令
本节包括以下小节:• VCVT向量在定点数或整数与浮点数之间转换。• VDUP将标量复制到向量的所有向量线。• VEXT提取。• VMOV、VMVN(立即数)移动和求反移动(立即数)。• VMOVL、V{Q}MOVN、VQMOVUN移动(寄存器)。• VREV反转向量中的元素。• VSWP交换向量。• VTBL、VTBX向量表查找。• VTRN向量转置。• V...原创 2019-11-11 08:17:54 · 1200 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON 逻辑运算和比较运算
这节内容包括:• VAND、VBIC、VEOR、VORN 和 VORR(寄存器)按位与、位清除、异或、或非以及或(寄存器)。• VBIC 和 VORR(立即数)按位位清除和或(立即数)。•VBIF、VBIT 和 VBSL为 False 时按位插入,为 True 时按位插入以及按位选择。• VMOV、VMVN(寄存器)移动和求反移动。• VACGE 和 VACGT比较绝对值。•...原创 2019-11-06 19:55:56 · 2006 阅读 · 0 评论 -
【NEON 和 VFP 编程】NEON 和 VFP 共享的指令
NEON 和 VFP 共享的指令包括以下内容:1.VLDR 和 VSTR扩展寄存器加载和存储。2.VLDM、VSTM、VPOP 和 VPUSH扩展寄存器加载多个和存储多个。3.VMOV(在两个 ARM 寄存器和一个扩展寄存器之间)在两个 ARM 寄存器和一个 64 位扩展寄存器之间传送内容。4.VMOV(在一个 ARM 寄存器和一个 NEON 标量之间)在一个 ARM 寄存器和半个...原创 2019-11-03 10:23:52 · 1890 阅读 · 0 评论 -
【NEON 和 VFP 编程】内联汇编语法
内联汇编,指在C语言中插入汇编语言。我们首先来看一段内联汇编的代码片段,然后再来具体语法是如何定义的。 unsigned int src = 0x1010adad; LOGI("src=%#X", src); unsigned int dst = 0; asm volatile( "VMOV.32 D0[0], %1\t\n" ...原创 2019-11-01 17:53:25 · 778 阅读 · 0 评论 -
【NEON 和 VFP 编程】通用信息
为避免重复,下面列出了许多指令共有的一些信息。• 浮点异常• 体系机构的版本• NEON 和 VFP 数据类型• NEON 中的正常指令、长指令、宽指令、窄指令和饱和指令• NEON 标量• 扩展记号• {0,1} 上的多项式算法• VFP 协处理器• VFP 寄存器一、浮点异常在会导致浮点异常的那些指令的描述中,会列出相应的异常。二、体系机构的版本所有 NEON 指令均...原创 2019-10-31 13:27:30 · 605 阅读 · 0 评论 -
【NEON 和 VFP 编程】扩展寄存器组
NEON 是适用于 ARM Cortex-A 系列处理器的一种128位 SIMD(Single Instruction, Multiple Data, 单指令、多数据)扩展结构。VFP 代表用于矢量运算的矢量浮点架构。迄今为止,VFP 主要有三个版本:VFPv1 已废弃;VFPv2 是对 ARMv5TE、ARMv5TEJ 和 ARMv6 架构中 ARM 指令集的可选扩展;VFPv3 是对 ...原创 2019-10-29 14:21:14 · 1540 阅读 · 0 评论 -
【NEON 和 VFP 编程】条件代码
在 ARM 状态下,可以使用条件代码来控制 VFP 指令的执行。 此类指令是根据 APSR 中的状态标记有条件执行的,执行方式与几乎所有其他 ARM 指令完全相同。在 ARM 状态下,除 VFP 和 NEON 公用的指令之外,不能使用条件代码来控制 NEON 指令的执行。在 Thumb-2 处理器上的 Thumb® 状态下,使用一个 IT 指令最多可在随后的四个 NEON 或 VFP 指令上设...原创 2019-10-29 08:38:41 · 1266 阅读 · 0 评论 -
记ARM NEON指令集深度优化
最近和同事一直讨论优化的事情,优化这个概念是模糊的,通常我们都是为了达到某种性能才考虑优化,当某种算法跑在CPU上较为消耗算力,达不到性能指标,可能就要优化。如果我们的代码是用JAVA编写的,那么可以使用Native(C/C++)语言替代其实现。如果Native语言还是无法满足性能要求,那么我们首先想到的应该是如何将Native实现为最优的版本,比如可以使用空间换时间—将一部分固定值先计算好,通过...原创 2019-09-08 15:27:12 · 1819 阅读 · 0 评论 -
ARM体系结构简介
一、概述从1995年,ARMV4(主要对应ARM7 family)开始到现在ARM RISC体系结构到现在已经演化了20多年。从设计一开始ARM就关注到了低功耗。到2011年,所有的ARM-Cotex family都被设计成使用ARMV7架构。ARM7:采用ARMV4架构ARM9:ARMV4的变体ARM11:ARMV4的变体Cotex-A8:为了匹配不同的市场,ARMV7从Cotex-...原创 2019-10-27 08:52:11 · 1143 阅读 · 0 评论