转自 http://blog.sina.com.cn/s/blog_602f87700102wj5w.html
作者:Sam (甄峰) [email protected]
之前在一些ARM CPU下,曾在编译时指定过Neon。
0. Neon简介:
0.1: 简介:
ARM Advanced SIMD延伸集,(ARM Cortex-A系列处理器的128位SIMD架构扩展)称为NEON技术,它是一个结合64bit和128bit的SIMD(Single Instruction Multiple Data单指令多数据)指令集。其针对多媒体和讯号处理程式具备标准化加速的能力,NEON具有一组广泛的指令集、各自的寄存器阵列,以及独立执行的硬件。ARM NEON技术可加速多媒体和信号处理算法(如视频编码/解码、2D/3D图形、游戏、音频和语音处理、图像处理技术、电话和声音合成)。
NEON的寄存器:有16个128位四字寄存器Q0-Q15,32个64位双字寄存器D0-D31,两个寄存器是重叠的,在使用的时候需要特别注意,不小心就会被覆盖掉。
0.2: SIMD:
通常我们进行多媒体处理的时候,很多的数据都是16位或者8位的,如果这些程序运行在32位的机器上,那么计算机有一部分的计算单元是没有工作的.所以这是一种浪费.为了更好的使用那些被浪费的资源.SIMD就应运而生了.SIMD这种技术就是使用一条指令,但对多个相同类型和尺寸的数据进行并行处理.就像我们现实生活中的好几个人都在做同一件事情那样,这样就可以将速度提升很多倍
0.3:使用Neon的方式:
按Sam的理解,使用Neon的方式有以下几种:
A:使用C的neon内联函数。
B:直接使用Neon汇编指令。
C:使用某些第三方库如OpenMAX.
各自的优缺点:
A:使用Neon intrinsics函数,可以在直接接触ASM的情况下,使用Neon。这些函数被定义在:
arm_neon.h 中。
类似于:
vadd_s8 (int8x8_t __a, int8x8_t __b)
此方法需要注意2点:
1.必须: #include
2.编译时必须加入; -mfloat-abi=softfp -mfpu=neon
B:使用汇编指令:
效率最高. 使用intrinsics没法控制寄存器分配和内存对齐等。
1.SIMD寄存器基本知识:
SIMD寄存器共有16个128位的向量寄存器构成。而32个双精度浮点寄存器共享了这16个寄存器;32个单精度浮点寄存器共享了前8个寄存器。因此,这寄存器组是与浮点寄存器共享的.
单精度寄存器用s0~s31表示;(32bit)
双精度寄存器用d0~d31来表示;(64bit)
而128位的SIMD寄存器则用q0~q15来表示.(128bit)
2. Neon的数据从内存向寄存器加载(vld)和从寄存器向内存存储(vst):
如何灵活有效的加载和存储数据,对SIMD来说非常重要。先举一下例子:
24-bit的RGB图像,像素在内存里的组织方式是R, G, B, R, G, B...,如果你想做一个简单的图像处理,比如把R和B通道互换,你该如何高效的使用NEON协处理器呢?
首先想到的办法是:从存储空间线性加载RGB数据到D寄存器(64位双精度寄存器),然后交换R和B数据。 但是这种线性加载的数据进行R和B通道的数据交换非常麻烦,需要首先掩码mask,然后移位并合并掩码数据。这种复杂的运算显然并不高效。如图所示:
从r0内存处,开始读取数据到寄存器。
D0,D1,D2这三个64bit寄存器中各放置了杂乱的8个色数据。这样非常不利于快速计算。
NEON提供了各种结构的加载和存储指令来处理这种情况,这些指令能把数据从存储区加载的同时还能把这些值分开存储到不同的寄存器中。
从r0内存处开始读取数据。
然后使用VLD3分开加载的数据就能方便的使用指令(VSWP d0, d2)来进行R和B通道的交换了。
然后把结果再写入内存,当然也要使用interleave交织模式的存储,即VST3存储指令。
3. 结构化加载和存储语法和具体指令:
NEON结构化加载会读取内存内容到64-bit的NEON寄存器,使用可选的deinterleave选项,同样加载指令也可以采用这种reinterleave的方式把寄存器的内容写到内存空间。
NEON存储和加载的结构化方式,语法包括如下5个部分:
交织模式:Interleave Pattern:
加载和存储指令可以用从1到4个相同大小的元素的交织结构体,这些元素可以是NEON指令通常支持的8,16或者32比特。
存储和加载类似,只是把寄存器的数据interleave然后写到内存。
元素类型 Element Types
加载和存储interleave的数据的基本元素可以为8,16或者32比特的数据。比如NEON指令VLD2.16 {d0, d1}将加载4个16-bit元素到第一个寄存器,然后4个16-bit元素到第二个寄存器,把临近的奇偶对分开保存到每个寄存器。
把元素大小变成32-bits还是加载相同大小的数据,但是只有2个元素来构成一个向量,同样分成奇偶元素部分。
4. 关于优化的几个例子:
// C version
void add_int_c(int* dst, int* src1, int* src2, int count)
{
int i;
for (i = 0; i < count; i++)
{
dst[i] = src1[i] + src2[i];
}
}
// NEON version
void add_float_neon1(int* dst, int* src1, int* src2, int count)
{
int i;
for (i = 0; i < count; i += 4)
{
int32x4_t in1, in2, out;
in1 = vld1q_s32(src1);
src1 += 4;
in2 = vld1q_s32(src2);
src2 += 4;
out = vaddq_s32(in1, in2);
vst1q_s32(dst, out);
dst += 4;
}
}
其中 vld1q_s32(src1):
被解析为: vld1.32 {d0, d1}, [r0]
vld: load数据到寄存器。 1:表示依次读取。32:每份数据32bit. d0, d1,两个64bit寄存器。所以,表示要读4份数据。 r0:从r0内存处开始读。
来源:网络
总览 本指南介绍了Arm Neon技术,用于实现Armv8–A或Armv8–R体系结构配置文件的高级SIMD(单指令多数据)体系结构扩展。 Neon技术为指令集体系结构提供了专用扩展,提供了可以在多个数据流上并行执行数学运算的附加指令。 这可以通过加速音频和视频编码/解码,用户界面,2D / 3D图形或游戏来改善多媒体用户体验。 Neon还可以加速信号处理算法...
一、引言 最早的NEON指令在ARM Cortex-A5内核上,作为可选的模块出现。 直到后ARM Cortex-A7全面支持NEON协处理器。才开始广泛应用于实际项目开发中。 由于32位寄存器的局限性,ARM公司的在神们希望,能过增加寄存...
汉化eclipse-4.6 刚刚接触eclipse,一切都是未知,全是英文界面,不小心关掉一个窗口后居然找不到了,原本还打算好好挑战一下英语呢,去年大一的时候挂了一次英语三级B,想想还是算了吧,不丢人了。 这是我的eclipse版本 我是今年刚刚下载的,应该是全新的吧!我刚刚搜了一下看ba …… 咦…,不好意思没跟上潮流。方法差不多,很简单的。 安装完成后...
NEON被设计为附加的加载/存储架构,以提供良好的矢量化, 编译器对c/c++等语言有良好的支持,这样可以实现很高水平的并行性。开发者可以为需要高性能的应用程序编写NEON指令来实现相应功能,最重要的是它实现了访问交叉存储在内存中的多个数据流并组织成想要的数据格式。NEON指令代码的编写可以看成是ARM普通编程的...
Zynq架构将内部结构分为处理器系统(Processing System, PS)和可编程逻辑(Programable Logic,PL)两部分,其中PS端的应用处理单元(Application Processing Unit,APU)中包含两个ARM处理器和两个Neon协处理器。这里的Neon技术是某些ARM处理器的128位SIMD体系结构的扩展,能够提供一定程度的加速功能。初步了解之后,做了个...
资料为网上收集如遇侵犯转载,请联系我,我会尽快撤销文章。谢谢~!!!! 启动DEBUG 1.打开Windows命令窗口 在Windows 95/98的环境中,打开命令窗口的步骤为:点击“开始”→“运行”,输入“command”命令; 在WindowsXP及WIN7的环境中,打开命令窗口的步骤为:点击“开始...
金属-氧化物-半导体(MOS)场效应管 N沟道增强型MOSFET 栅源加电压,在电场作用下产生沟道。产生沟道的门限开启电压VT。 漏源加电压,产生电压梯度,导致沟道夹断。预夹断的临界条件 输出特性 特性方程 可变电阻区 &...
提到响应式,就不得不提两个响应式框架——bootstrap和foundation。在标题上我已经说明白啦,今天给大家介绍的是foundation框架。 何为“尝鲜”?就是带大伙初步一下foundation的灵活和强大 何为“踩坑”?就是我把我使用的时候踩过的坑给标个记号,这样大伙用的时候就可以“绕道而...
word2vec 词向量 one hot Distributed representation CBOW&Skip-Gram CBOW Skip-Gram sigmoid函数 Huffman树 基于Hierarchical Softmax的模型 基于Negative Sampling的模型 本文基于word2vec原理CBOW与Skip-Gram模型基础 CBOW与Skip-Gram的模型...
官网:https://router.vuejs.org/zh/guide/essentials/navigation.html 一、安装路由 npm install vue-router --save-dev 在src目录下创建router目录 使用 vuecli3创建项目选择路由会自动创建route目录 在main.js引入router 二、配置路由 1、 hash: 使用 URL hash 值...
It keeps saying : ORA-00933: SQL command not properly ended Pls help me or give me a link to a solution You can use a correlated subquery instead:...
I'm doing an Json call to retrieve an a list of locations with information details for each location. longitude and latitude are included in this info. I am using Google's distance matrix api to get t...
Suppose you have a database which has an 'n' number of schemas with an 'n' number of tables each. Each of these contain an 'n' number of columns. How would I print all this data along with the data ty...
Could anyone please help how do I solve this error: I am using IDEA IDE as a first time, and have been using Resin_4.0.37 as a server to test my work. As soon as I start my lcoal server in debug mode ...
i am trying to develop a remote desktop apps with c#. so i have couple of question regarding mouse coordinate calculation based on picture box suppose i have picture box and i want to capture mouse co...