《基于FPGA的嵌入式系统设计》课件第8章_第1页
《基于FPGA的嵌入式系统设计》课件第8章_第2页
《基于FPGA的嵌入式系统设计》课件第8章_第3页
《基于FPGA的嵌入式系统设计》课件第8章_第4页
《基于FPGA的嵌入式系统设计》课件第8章_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章基于ARMSoCFPGA的DSP设计8.1NEON和通用DSP的性能对比8.2Bare-metal下对NEON和FPU的支持及优化8.3NEON的语法特征8.4DSP开发实例

8.1NEON和通用DSP的性能对比

ARMNEON通用SIMD(SingleInstructionMultipleData,单指令多数据流)引擎可有效处理当前和将来的多媒体格式,从而改善用户体验。NEON技术可加速多媒体和信号处理算法(如视频编码/解码、2D/3D图形、游戏、音频和语音处理、图像处理技术、电话和声音合成),其性能至少为ARMv5性能的3倍,为ARMv6SIMD性能的2倍。NEON技术是ARMCortex-A系列处理器的128位SIMD体系结构的扩展,指令构建方式清晰,并可无缝用于其本身的独立流水线和寄存器文件,从而可明显改善程序性能。

NEON指令可执行“打包的SIMD”处理:

(1)寄存器被视为同一数据类型的元素的矢量。

(2)数据类型可为有符号/无符号的8位、16位、32位、64位单精度浮点。

(3)指令在所有通道中执行同一操作。

使用NEON技术的ARMCortex-A系列处理器,以及ARM的Mali多媒体硬件解决方案可用于多媒体应用,范围为从智能手机和移动计算设备到HDTV(HighDefinitionTelevision,高清晰度电视)。

NEON增强了用户体验,例如增强了多媒体的用户体验:

(1)可观看任意格式的任意视频。

(2)编辑和强化捕获的视频,即视频稳定性。

(3)锯齿消除渲染和合成。

(4)游戏处理,语音识别。

(5)快速处理几百万像素的照片。

(6)具有强大的多通道高保真音频处理。

NEON支持用于Internet应用程序的范围广泛的多媒体编解码器,例如:

(1)许多软编解码器标准:MPEG-4、H.264、On2VP6/7/8、Real、AVS等。

(2)对于各种格式的正常大小的“Internet流”解码来说,是理想的解决方案。

(3)不仅仅针对编解码器,还适用于2D、3D图形和其他矢量处理。

(4)提供现有工具、操作系统支持和体系结构支持。

所需指令周期减少,因此:

(1) NEON可使复杂视频编解码器的性能提升60%~50%。

(2)单个简单DSP算法可实现更大的性能提升(4~8倍)。

(3)处理器可更快进入睡眠状态,从而在整体上节约了动态功耗。

NEON技术能够提高算法性能并简化软件开发过程,如:

(1)通过对齐和非对齐数据访问,可对SIMD操作进行有效的矢量化。

(2)具有清晰的指令集体系结构,可设计用于自动矢量化编译器和手动编码。

(3)有效访问打包数组,如ARGB或xyz坐标。

(4)支持整数和浮点操作,以确保适合从编解码器、高性能计算到3D图形等广泛的应用领域。

(5)与ARM处理器紧密结合,提供单指令流和内存的统一视图,从而能够提供一个具有更简单工具流的开发平台目标。

(6)通过具有双128位/64位视图的大型NEON寄存器文件,可有效处理数据并尽可能减少对内存的访问,从而增加了数据吞吐量。

ARM浮点体系结构(VFP)为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合IEEE754标准,并提供完全软件库支持。ARMVFP的浮点功能为汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的3D转换、FFT和过滤)中使用的浮点运算提供增强的性能。消费类产品(如Internet设备、机顶盒和家庭网关)可直接从ARMVFP受益。

VFP应用包括:

(1)汽车控制应用:动力系统,如ABS、牵引控制和主动悬架。

(2) 3D图形:数字消费类产品,如机顶盒、游戏机。

(3)图像:激光打印机、静态数码相机、数码摄像机。

(4)工业控制系统:运动控制。

工业和汽车领域中的许多实时控制应用都得益于ARMVFP提供的浮点的动态范围和准确性。汽车动力系统、防抱死制动系统、牵引控制和主动悬架系统都是关键业务应用,它们对准确性和可预测性的要求必不可少。将VFP架构版本中的VFP9-S整合到SoC设计中后,可使开发速度更快、性能更可靠。使用科学计算工具(Matlab、MATRlxx等)可直接对系统建模和派生应用程序代码,从而确保系统设计行为更准确、可靠和可预测。

DSP指令集的特点如下:

(1)单周期16 × 16和32 × 16MAC实现。

(2)与基于ARMv7理器的CPU产品相比,DSP性能提高了2~3倍。

(3)零开销饱和扩展支持。

(4)用于加载和存储寄存器新指令,包括增强的寻址模式。

(5)新的CLZ指令改进了算术运算标准化,提高了除法性能。

(6)在ARMv5TE、ARMv6、ARMv7架构中完全受支持。

DSP指令集的应用如下:

(1)音频编码/解码(MP3、AAC、WMA)。

(2)伺服马达控制(HDD/DVD)。

(3) MPEG4解码。

(4)语音和手写识别。

(5)嵌入式控制。

(6)位准确算法(GSM-AMR)。

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

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

当应用级ARM集成了FPU和NEON硬核浮点处理单元以后,如Cortex-A8/A9,其性能可以与大部分高档DSP处理能力相当。相同频率下,双核A9是单核A8速度的2倍左右,在器件选型时,需按照相关参数的2倍左右进行评估。

8.2Bare-metal下对NEON和FPU的支持及优化

NEON是作为ARM处理器的一部分而执行的,但是NEON有独特的不同于ARM寄存器组的执行通道和寄存器组。其主要特征包括对齐和非对齐的数据访问,整型支持,定点和单精度浮点数据类型,多个视图的大型寄存器文件,且与ARM处理器紧密结合。NEON指令适用于ARM和Thumb指令集。NEON内嵌函数在头文件arm_neon.h中定义。头文件既定义内嵌函数,也定义一组向量类型。

NEON单元有一个寄存器组,它包括32个64位的向量寄存器。NEON单元可将这个寄存器组视为如下两种形式:

(1) 16个128位的四倍字长寄存器,即Q0~Q15。

(2) 32个64位的双字节长寄存器,即D0~D31。

这些寄存器可以在NEON单元中并行操作。例如,在向量加法指令中可以将8个16位的整型数加到另外8个16位的整型数以产生新的8个16位的整型结果,这就是所谓的单指令多数据(SIMD)向量化。NEON单元支持8位、16位、32位整型操作和一些64位操作,除了单精度(32位)浮点运算,它还可以操作在2组、4组、8组或16组数据上(Cortex-A9处理器同样支持16位浮点操作)。

NEON单元被归类为一矢量化的单指令多数据(SIMD)单元,通过使用一条指令就可以在矢量寄存器中对多个数据进行操作。

NEON单元仅能处理在内存中连续存储的向量,所以NEON单元不能通过间接寻址向量化。在编写NEON结构时,请确保NEON结构加载时需要结构中包含同等大小的元素。

ARM编译器提供了许多可以在硬件和软件方面管理浮点运算的功能。例如,用户可以指定软件或硬件支持浮点,尤其是硬件架构,符合IEEE浮点标准的水平。

当使用浮点协处理器来编译程序时,程序通过目标协处理器的浮点机器指令来执行基本浮点算法。但是,当使用软件浮点来编译程序时,没有浮点指令集可用,因此,ARM库必须提供一组过程调用来执行浮点算法。这些过程位于软件浮点库fplib中。

各种浮点选项的设置决定了浮点性能、系统成本和系统灵活性之间的权衡关系。为了获得性能、成本和灵活性最好的权衡,必须在浮点选项的设置方面做出较好的选择。在实践中,通常在VFP架构中结合硬件来实现浮点运算,若采用软件来处理不常用的算法,则会引起异常。

可支持的浮点运算如下:

(1)在软件方面,通过fplib浮点库,可以调用该库提供的函数来实现无需额外硬件的浮点运算。

(2)在硬件方面,使用硬件矢量浮点(VFP)协处理器与ARM处理器,可提供所需的浮点运算。VFP是一个遵循IEEE浮点标准的协处理器架构,支持单精度和双精度,但不支持扩展精度。

若FPU或NEON是可用的,比如为带有FPU的处理器指定--cpu选项,那么编译器就可能将FPU或NEON指令引入到所写的代码中。即使不刻意执行任何浮点运算,这些指令还是会被引入。

当把裸机作为目标,并使用编译器编译FPU或NEON指令时,在执行FPU或NEON之前,用户需要使能启动代码中的FPU和NEON。

NEONC扩展是由ARM定义的一组新的数据类型和内嵌函数,用于从C访问NEON单元。大部分向量函数直接映射到NEON单元中提供的向量指令,并且由NEON增强的ARMC编译器进行内联编译。通过使用这些扩展,性能可以达到C语言级别,这可以与通过汇编语言编码达到的性能相媲美。

通过使用可向量化的循环进行编码(而不是使用显式的NEON指令编写代码),可以保留处理器之间的代码可移植性。这样可以轻松达到与手写编码向量化类似的性能级别。在为改善性能使用向量化进行优化时,可以启用和禁用向量化选项,但这样不一定能够得到最佳代码性能。

大部分应用程序需要优化,以获得最佳向量化性能,但理论上是不可能达到最佳性能的。例如,NEON单元可以同时处理四个单精度浮点数,这意味着,理论上浮点应用程序的最佳性能应该是原始标量非向量化代码的四倍。在典型的开销下,整个浮点应用程序的合理目标是比标量代码的性能提高50%。对于不可完全向量化的大型应用程序,比标量代码的性能提高25%是比较合理的目标。

向量化的执行方式确保优化代码得出的结果与非向量化代码相同。但在某些情况下,不执行循环的向量化,以避免出现错误结果,但这可能会导致代码不是最优化,用户可能需要手动优化代码,以使其更加适合自动向量化。

使用命令行选项还可获得进一步的代码优化。性能优化时,读者必须考虑到高级算法结构、数据元素大小、数组配置、严格的迭代循环、缩减运算和数据相关性问题。性能优化要求了解程序中最花费时间之处。若要获得最佳性能优势,可能需要使用符合实际条件的代码分析及确定代码基准。

8.3NEON的语法特征

NEON代码的计算效率很高,下面所示为实现信号增益的代码实例,其效果是对信号进行了增强。

这样可以减少系统资源开销,提高性能,增加并发指令的可能性。可是,乘法指令循环复杂的问题仍然存在,使用NEON内部函数,代码看起来会截然不同:

NEONMPE工程最重要的特征如下:

(1)额外引入的寄存器专门用于NEON运算。这些寄存器可以通过不同的方式进行编址。例如,若使用128位寄存器,可以储存四个32位的数到一个寄存器。当一条指令执行时,单一的指令中将会在四个数值上执行,性能提高了四倍。

(2)支持有符号/无符号的8位、16位、32位和64位整型数以及单精度浮点数。

(3)支持加载大量结构化的数据,当数据加载/存储时允许交叉存取或非交叉存取。

(4)内部函数可以与C语言集成使用。因此当采用这些指令时没有必要编写使用汇编语言编写的任何代码。如前面的代码中使用的是内部函数,没有使用任何汇编语言。

(5)在ARM执行单元中进行异步操作时,访问内存必须小心,若出现不正确的操作则会导致CPU停滞,这种停滞需要花费几十个周期才能解决。在使用NEON指令进行优化时,这是一个很关键的问题,即NEON指令和常规ARM代码混合使用时经常会引起大量的停滞,以至于使用NEON指令带来的性能提升不明显。此问题的解决办法是尽可能以NEON格式保存数据。

8.4DSP开发实例图8.1实现从0~99的加法运算结果

8.4.1基本的DSP处理模块本节以实现从0-99的加法运算作为使用NEON函数的基本DSP处理模块实例。

8.4.2浮点向量运算

本节介绍的是简单的浮点向量运算。VFP除了对浮点数基本运算(加、减、乘、除、开方、比较、取反)提供支持之外,其向量(vectors)功能能够使它同时支持最多8组单精度、4组双精度浮点数的运算。本例将两个浮点型数组中各自的元素相乘,存放在c[4]数组中。

结果如图8.2所示。图8.2将两个浮点型数组中各自的元素相乘后的结果

8.4.3矩阵运算

本节介绍的是用NEON优化矩阵乘法的实例,介绍如何用NEON有效地处理一个4 × 4的矩阵乘法运算。这种类型的运算经常用于3D图形,我们认为这些矩阵在内存中是以列为主排列的。

由于数据是按照列序存储的,因而矩阵乘法就是把第一个矩阵的每一列乘以第二个矩阵的每一行,然后把乘积结果相加。乘累加结果作为结果矩阵的一个元素。实现原理如图8.3所示。图8.3矩阵乘法中的向量乘以标量的运算

如图8.3所示,假设每列元素在NEON寄存器中表示为一个向量,那么上述的矩阵乘法就是一个向量乘以标量的运算,而后续的累加也同样可以用向量乘以标量的累加指令实现。这是因为操作是在第一个矩阵的每一列上完成,然后计算列的结果,读列元素和写列元素都是线性的加载和存储操作,不需要交织(interleave)的加载和存储操作。

结果如图8.4所示。图8.4矩阵运算结果

8.4.4FFT算法实现

本节介绍如何用NEON寄存器组来做FFT算法。通常要利用FFT算法来优化移动多媒体技术中的IMDCT/PQMF(InverseModifiedDiscreteCosineTransform/PolyphaseQuarterMirrorFilter)变换,必须选择一种最适合NEON的FFT算法结构。在多数音频编解码器中,变换长度通常为2的幂,即一种基数为2的算法或混合基数算法(可使用基数8、基数4等)。基数较高的算法具有运算次数少的优势。除此以外,较高基数算法下,数据加载/存储次数也会大幅减少。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论