From

接下来就要讲的就是NEON这个东西了.

一开始见到它还觉得它是一个可有可无的技术,后来看了很多的文章以后发现这个才是优化的突破口.

1.什么是SIMD ####
其实这个术语我很久以前就已经听过了,可以一直只有表面的理解,不就是单指令多数据流吗.难道这个还能比MIMD还要牛逼吗,一直觉得这是一种可有可无的技术,就算就在今天我还是觉得这样的技术就是过渡性的技术.可是今天看了一篇文章以后才发现它都有用之处. 
通常我们进行多媒体处理的时候,很多的数据都是16位或者8位的,如果这些程序运行在32位的机器上,那么计算机有一部分的计算单元是没有工作的.所以这是一种浪费.为了更好的使用那些被浪费的资源.SIMD就应运而生了.SIMD这种技术就是使用一条指令,但对多个相同类型和尺寸的数据进行并行处理.就像我们现实生活中的好几个人都在做同一件事情那样,这样就可以将速度提升很多倍.

2.什么是NEON
ARMv7体系结构介绍了增强性SIMD的扩展,它通过定义大量了在64位和128位的寄存器指令用来扩展了SIMD的概念. 
据文档上了解NEON就是将增强性SIMD的扩展使用在ARM处理器上的实现.也就是说NEON是指用一种特定的方式去实现的过程.现在ARM Cortex-A8的系列是具有着NEON.具有NEON技术的处理器都会配备了32个64位的寄存器和16个128位的寄存器,它们分别被标识为(D0-D31),(Q0-Q15)

NEON的指令集只是ARM和THUMB指令集中的子集,ARM和THUMB要管理所有程序流和同步的问题.NEON指令通常执行的就是:

内存的访问
在NEON寄存器和传统寄存器之间的数据拷贝
数据类型的转化
数据的处理
3.关于NEON的编程模式
如何才能去优化NEON的代码呢??

这就是怎么样去使自己编写的代码能整合进NEON的技术,这样编译器就可以在编译的过程中尽可能的使用NEON的处理方式.

要使用NEON,那就使用NEON本身支持的指令效果最好了,那么NEON本身提供了什么样的指令呢??

就像上面所说那样,本身NEON指令提供的功能也很有限,主要在于数据的装载和存储,以及数据的处理.这应该是NEON指令的核心能力了.NEON的指令都是以V字母开头的.

VADD.I16 q0,q1,q2

这就是一个NEON的指令了,很明显的特点就是V开头,I主要用来表明是一个整型,16表示一个16位的整型,q0,q1,q2都是128位的寄存器(q打头的寄存器都是128位的).其实这个指令的意思就是让q1,q2中装载8个16位的数据,然后执行加法操作,最后放到q0中去.这么一个指令就完成了8次加法运算,也就是性能的提升.

像上面的指令,NEON还有很多.比如还提供比如RGB三个元素,分别取到3个不同的寄存器中,每一个寄存器中的元素要不都是R要不都是G要不都是B,这样一来就可以进行并行运算了.

既然知道了这些指令,那么使用到程序中去的话有几种手段呢??

C语言级别的C语言级别的优化当然是对高级语言这个阶段来说的,对于NEON来说,这个级别的优化不是指那些很通用的优化手段,虽然那些能达到优化的作用,但是没有充分的利用NEON这的技术,所以很多时候你会发现,网上很多人说这个板子很厉害很厉害,可是你在上面开发的程序就是很慢很慢,这也就说明了你没有充分的利用其中的硬件资源.
C语言的优化可以分为两个手段:

内联函数
内联函数有可能会被误会成我们通常想的那样,主要是这个单词我翻译不正确(intrinsics).这样的函数可以被C和C++的程序所调用.看上去和别的函数没有很多的区别,最多也就名字比较古怪.但是其实当这个代码在被编译器编译的时候,它会被转化为有序的低级指令.这些指令就是NEON的指令了.所以这样就办到了在高级语言层次使用低级语言了.主要是很简单的可以使用.最为主要的就是程序员不用去接触汇编了,可以减小优化的难度.当然我可以说这样的优化效率没有使用汇编的来的高.

对于上面的这种技术其实就是ARM公司本身给你做好了一些函数,你就直接调用这些函数,这些函数在编译的时候就可以直接转化成NEON的汇编指令.为了支持这些内联的函数所以必须要包含头文件arm_neon.h.

#include <arm_neon.h>
 uint32x4_t double_elements(uint32x4_t input)
 {
 return(vaddq_u32(input, input));
 }
像vaddq_u32这样的函数,gcc还提供很多很多,如果想知道更多可以查看gcc_neon. 
当然使用了NEON技术以后必须还要通过在编译的时候加入-mfpu=neon才能起到效果的.整个编译的命令就是arm-none-linux-gnueabi-gcc -mfpu=neon intrinsic.c

汇编级别的
这个级别的优化是比较难的,但是也是最为有效的.通过对NEON指令的掌握然后对程序中消耗最大的那个部分进行汇编级别的改造,这样会有很大的区别.我昨天看了一篇文章上讲了,c级别的改造只提高性能1.5倍,但是汇编级别的就是7.5倍,从中可以看出之间的差距了吧.

使用库
ARM公司好像本身对NEON的技术做成了一个库(OPENMAX),里面都是ARM公司作了NEON作的优化程序.所以可以使用这些库函数来完成一些功能.可以在ARM

4. 总结
NEON的知识点还有很多,不过核心的就是这么一些其他就是它的扩展.要具体问题具体分析,对于现在我在做cortex-A8我觉得这个技术应该对我的帮助会很大...接下来就试试这个技术吧.

SIMD与NEON概念理解相关推荐

  1. 高性能计算中并行的概念理解

    高性能计算中并行的概念理解 分类: 并行计算高性能计算HPC - General2011-11-09 22:54 932人阅读 评论(0) 收藏 举报 编译器编程parallel优化formsvect ...

  2. 深度学习中IU、IoU(Intersection over Union)的概念理解以及python程序实现

    from: 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 IoU(Intersection over Union) Intersectio ...

  3. 目标检测基本概念理解之IoU(交并比)以及Python代码实现

    目标检测基本概念理解之IoU(交并比) 交并比理解 Python代码实现 计算IoU,矩形框的坐标形式为xyxy 计算IoU,矩形框的坐标形式为xywh 交并比理解 在检测任务中,使用交并比(Inte ...

  4. Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享

    HDFS是什么? HDFS 全称 Hadoop Distributed File System ,简称HDFS,是一个分布式文件系统.它是谷歌的GFS提出之后出现的另外一种文件系统.它有一定高度的容错 ...

  5. muck数据的概念理解

    muck数据的概念理解 所谓muck表示"模仿","假的":也可翻译为mock-test. 很多项目案例的讲解中,经常会提及muck数据.muck对象.muck ...

  6. 事件与委托的一点概念理解

    事件与委托的一点概念理解 早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下! Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要 ...

  7. 目标检测中IoU(Intersection over Union)的概念理解

    参考博客 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 一.IoU(交并比)概念 Intersection over Union,是一种测 ...

  8. C/C++中宏概念理解

    C/C++中宏概念理解 C/C++中宏概念理解 宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为"预处理器"的模 ...

  9. DSF学习1_Dubbo详解(一)分布式服务框架的概念理解

    Dubbo分布式服务框架的概念理解 Dubbo是是一个高性能,基于Java的RPC框架,由阿里巴巴开源.一个分布式的服务框架.可以实现SOA(面向服务的架构)架构. Dubbo使用的公司:京东.当当. ...

最新文章

  1. Java中ArrayList源码分析
  2. html canvas text 居中,HTML5 Canvas Text文本居中实例
  3. stay hungry stay foolish原文_弟子规原文+译文+注释
  4. Javascript JSON格式
  5. Android控件用法总结之EditText
  6. Makefile之变量(10)
  7. 用Android Studio画UI界 --- 以Job/Task Schedule为例(英文版)
  8. linux(centos8 ) 下安装anaconda3
  9. 医疗大数据为何发展如此缓慢
  10. 2、两数相加(python)
  11. torch随机数 manual_seed
  12. css-图片模糊处理
  13. hadoop大数据生态概述
  14. 2387: [Ceoi2011]Traffic
  15. 新生周赛——YZJ的牛肉干
  16. ubuntu下firefox浏览器不能播放视频解决方法
  17. 电子科技大学信息与通信工程学院考研复试总结
  18. Ubuntu硬盘空间不足时,添加硬盘的方法
  19. 知云文献翻译没反应_论文翻译工具--Copytranslate
  20. Qt学习笔记——获取本机网络信息(IP, 子网掩码, 广播地址,主机名

热门文章

  1. 『资源』机器学习实践中文资源合集
  2. 人工智能将为维护网络安全带来更多可能
  3. linux运维常见英文报错中文翻译(菜鸟必知)
  4. Linux守护进程的启动方法
  5. php -- 魔术方法 之 自动加载:__autoload()
  6. soapUI(groovy脚本作用2)请不要问为什么系列2
  7. Android 常用开发工具收藏
  8. 科技公司钟爱的50款开源工具
  9. 2016年最值得关注的16个网页设计趋势
  10. php读取doc pdf文件,PHP读取创建txt,doc,xls,pdf类型文件