[ARM开发] 【Altera SOC体验之旅 】Soc FPGA之DSP进阶---NEON高性能媒体引擎(一)

CMika   2015-5-6 22:27 楼主
本小节对NEON做简单介绍

NEON 技术可加速多媒体和信号处理算法(如视频编码/解码、2D/3D 图形、游戏、音频和语音处理、图像处理技术、电话和声音合成),其性能至少为 ARMv5 性能的 3 倍,为 ARMv6 SIMD 性能的 2 倍。
通过干净方式构建的 NEON 技术可无缝用于其本身的独立管道和寄存器文件。
NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)
NEON 指令可执行“打包的 SIMD”处理:
  • 寄存器被视为同一数据类型的元素的矢量
  • 数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点
  • 指令在所有通道中执行同一操作



使用 NEON 技术的 ARM Cortex™-A 系列处理器,以及 ARM 的 Mali 多媒体硬件解决方案可用于多媒体应用,范围从智能手机和移动计算设备到 HDTV。

NEON是ARM公司的商标,也是高端ARM处理器集成的硬IP,类似intel的MMX、SSE硬件指令集。


NEON 的特征和优点NEON 支持用于 Internet 应用程序的范围广泛的多媒体编解码器:
  • 许多软编解码器标准:MPEG-4、H.264、On2 VP6/7/8、Real、AVS
  • 对于各种格式的正常大小的“Internet 流”解码来说,是理想的解决方案
  • 不仅仅针对编解码器,还适用于 2D 和 3D 图形和其他矢量处理
  • 提供现有工具、操作系统支持和生态体系支持

所需周期减少:
  • NEON 可使复杂视频编解码器的性能提升 60-150%
  • 单个简单 DSP 算法可实现更大的性能提升(4 倍 -8 倍)
  • 处理器可更快进入睡眠状态,从而在整体上节约了动态功耗

NEON 技术的大量元素能够提高性能并简化软件开发过程,如:
  • 通过对齐和非对齐数据访问,可对 SIMD 操作进行有效的矢量化。
  • 清晰的指令集架构,设计用于自动矢量化编译器和手动编码。
  • 有效访问打包数组,如 ARGB 或 xyz 坐标
  • 支持整数和浮点操作,以确保适合从编解码器、高性能计算到 3D 图形等广泛应用领域。
  • 与 ARM 处理器紧密结合,提供单指令流和内存的统一视图,从而能够提供一个具有更简单工具流的开发平台目标。nbsp;
  • 通过具有双 128 位/64 位视图的大型 NEON 寄存器文件,可有效处理数据并尽可能减少对内存的访问,从而增加了数据吞吐量。


如何使用 NEONOpenMAX DL 库:
  • 加速 AV 编解码器的建议方法
  • 以源格式释放的库,在 ARM 网站上免费提供
  • 支持以下格式:MPEG-4 简单配置文件、H.264 基准、JPEG、MP3、AAC
  • 支持以下功能:FIR、IIR、FFT、点积、色彩空间转换、de-blocking.de-ringing、旋转、缩放、合成

矢量化编译器:
  • 使用现有源代码自动搜索 NEON SIMD
  • 受 ARM RealView 开发套件(v3.1 Pro 及更高版本)支持
  • 在 2007q3 及更高版本中受 gcc 支持

C 内部函数:
  • C 函数调用接口至 NEON 操作
  • 支持 NEON 支持的所有数据类型和操作
  • 在 ARM RealView 开发套件(3.1 及更高版本)和 gcc 2007q3 及更高版本中受支持

汇编器:
  • 针对确实需要在最低级别进行优化的用户
  • 在 ARM 的 RealView 开发套件(3.1 及更高版本)和 gcc 2007q3 及更高版本中受支持


开源社区中的 NEON 支持
当前,在以下开源项目中支持 NEON:
  • Android – NEON 优化

    • 使用 NEON,Skia 库 S32A_D565_Opaque 的速度加快了 5 倍

  • Ubuntu 09.04 支持 NEON:

    • 关键共享库的 NEON 版本

  • Bluez – 官方 Linux 蓝牙协议堆栈

    • NEON SBC 音频编码器

  • Pixman(Cairo 2D 图形库的一部分)

    • 合成/alpha 混合
    • X.Org、Mozilla Firefox、Fennec 和 Webkit 浏览器
    • 例如,使用 NEON 后,fbCompositeSolidMask_nx8x0565neon 的速度提高了 8 倍

  • ffmpeg - libavcodec

    • 用于众多 Linux 分发版的 LGPL 媒体播放器
    • 视频:MPEG-2、MPEG-4ASP、H.264 (AVC)、VC1
    • 音频:Ogg Vorbis

  • x264 – Google 2009 年度编程之夏

    • GPL h.264 编码器 – 例如,针对视频会议



DSP 扩展
ARM DSP 指令集扩展增加了高性能应用中 ARM 解决方案的 DSP 处理能力,同时通过便携式、电池电源设备提供所需的低能耗。DSP 扩展已经过优化,适用于众多软件应用(包括伺服马达控制、Voice over IP (VOIP) 和视频/音频编解码器),其中此扩展可增强 DSP 性能,使其能够有效处理所需任务。
特点
  • 单周期 16x16 和 32x16 MAC 实现
  • 与基于 ARM7™ 处理器的 CPU 产品相比,DSP 性能提高了 2-3 倍
  • 零开销饱和扩展支持
  • 用于加载和存储寄存器对的新指令,包含增强的寻址模式
  • 新的 CLZ 指令改进了算术运算标准化,提高了除法性能
  • 在 ARMv5TE、ARMv6 和 ARMv7 体系结构中完全受支持





应用

  • 音频编码/解码(MP3:AAC、WMA)
  • 伺服马达控制 (HDD/DVD)
  • MPEG4 解码
  • 语音和手写识别
  • 嵌入式控制
  • 位准确算法 (GSM-AMR)

用于 ARM 架构的编译器可以使用这些 DSP 扩展来改进标准 C 和 C++ 软件的代码生成过程,或者允许软件开发人员要求通过内部函数或内联汇编代码显式使用这些扩展。

ARM DSP 扩展改进了 DSP 性能,且无需非常高的时钟频率。几乎不增加典型实现中的功耗即可获得此性能。DSP 扩展广泛应用于智能手机以及需要大量信号处理的类似嵌入式系统,从而避免使用其他硬件加速器。DSP 扩展可与 32 位 ARM 和 16 位Thumb® 指令集完全兼容,从而确保所有现有操作系统和应用程序代码都可在支持 DSP 且基于 ARM 处理器的设备上重用。这些扩展广泛适用于大量细分市场,包括无线、大容量存储、汽车、消费娱乐和数字图像。

NEON原理


NEON 指令可执行“打包的 SIMD”处理:
寄存器被视为同一数据类型的元素的矢量
数据类型可以为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点

          原理图如下:
   

            下图通过SISD(单指令单数据)和SIMD(单指令多数据)的对比,来说明NEON的工作原理

            
    从图上可以看到,对于SISD,每个指令只能处理一个数据,而SIMD一个指令可以处理多个数据,因为多个数据的处理是平行的,因此从时间来说,一个指令执行的时间,SISD和SIMD是差不多的。由于SIMD一次可以处理N个数据,所以它的处理的时间也就缩短到SISD的1/N。
     需要指出一点,NEON是需要硬件的支持的,需要有一块寄存器放到硬件上来处理这个的。


NEON的使用
  NEON的函数是C语言风格,但是编译后成为汇编语句,这样执行的效率会提高。
   NEON代码的计算效率很高,举例1为实现信号增益的代码实例。

  
    举例1
   标准C语言:
    for(i=0;i
   {
     output=input;
   }
   上述代码每次迭代仅能处理单一的值,通过这个展开循环可以进一步提高效率。
    for(i=0;i
   {
     output=input;
     output[i+1]=input[i+1];
     output[i+2]=input[i+2];
     output[i+3]=input[i+3];
   }
   这样可以减少系统资源开销,提高性能,增加并发代码可能性。可是,乘法指令循环复杂的问题仍然存在,使用NEON内部函数,代码看起来会截然不同。
   for(i=0;i
   {
     //加载
     samples_f32=vldlq_f32(input+i);
     //执行乘法运算
     samples_f32=vmulq_f32(samples_f32,1.2);
     //储存结果
     samples_f32=vstlq_f32(output+i,samples_f32);
   }


     举例2
    下面是一个用C现实的将GRB转化成灰度图的算法


     
下面是一个用NEON现实的将GRB转化成灰度图的算法



     
对以上函数进行说明如下
     
把权重放入NEON寄存器
      

    一次载入8 pixles到三个NOEN寄存器,这个地方是重点可以说明NEON的高效率



   



       计算结果

      
      

回复评论 (6)

加油 加油
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-5-6 23:16

多多指点啊    希望能顺利完成这个系列
点赞  2015-5-6 23:17
其实我看不懂 只是前来围观 学习
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-5-6 23:18
引用: chenzhufly 发表于 2015-5-6 23:18
其实我看不懂 只是前来围观 学习

您太谦虚了     
点赞  2015-5-6 23:22
NEON虽然号称很猛,不过我也没实际使用过,跟LZ多学习学习,以后好跟客户做推广
点赞  2015-5-7 00:00
学习了。。。。。。。。
分享铸就美好未来。。。
点赞  2015-5-7 07:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复