NEON在S2平台图像处理中的简单应用

NEON:是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。

S2:安霸公司新一代高性能Soc,集成两个Crotex-A9、iDsp、vDsp等,可实现最高1080P120fps网络摄像机方案。

 

         安霸S2平台的开发方式为基于安霸公司的Linux SDK,用户仅可对Crotex-A9可编程,调用SDK接口实现基本的图像处理。在当前smart IPC、smart Dome智能处理应用中,存在如下不足点:

         1.获取智能处理所需的yuv原始数据,只能从编码通道获取,在编码缓存释放之前从内部编码缓存中拷贝出来,由于原图数据量大,对于其拷贝优化很有必要(GDMA未开放外部使用)。  

        2.没有可独立调用的缩放模块,获取的yuv数据分辨率随编码分辨率改变而改变,智能应用不够灵活。

        3.图像的镜像、旋转均在编码时完成,获取的yuv数据均未作镜像、旋转,从而使智能处理图像、抓图图像与视频预览不一致。

 

NEON是一个SIMD数据处理架构,256字节的寄存器堆包含32个64-bit位宽的寄存器或者16个128-bit位宽的寄存器。所有的寄存器都被视为具有相同数据类型的一个向量,支持的数据类型包括有符号或者无符号的8-bit、16-bit、32-bit和64-bit的整型数据或者单精度浮点数据。NEON指令都是针对相同数据类型的通道处理的,即所有通道执行相同的指令操作。如下图1所示。

NEON在S2平台图像处理中的简单应用_第1张图片

图1 指令在所有通道中执行同一操作

 

NEON的寄存器组:NEON这些寄存器和ARM核的寄存器截然不同,NEON还会采用ARM的寄存器作为地址寄存器间接寻址。图2是NEON寄存器的视图,16个128-bit的4字节寄存器Q0~Q15,或者32个64bit的双字寄存器D0~D31,VFPv3的寄存器堆还有32个32-bit的寄存器S0~S31.

NEON在S2平台图像处理中的简单应用_第2张图片

图2 NEON寄存器组视图

 

关于NEON指令集的详细介绍,参考文档如下:

《DUI0348BC_rvct_comp_ref_guide(编译器参考指南)》

《DUI0204IC_rvct_assembler_guide(汇编器指南)》

 

在实际项目工程中,针对前面提到的3个不足进行了优化:

1.      neon_memcpy优化

内存拷贝主要实现数据的加载和存储,针对这个特点主要优化方法如下:

(1)       利用neon寄存器组128bit宽度优势,使用neon加载、存储指令,单指令读取和存储更多数据(相比arm32bit寄存器)。

(2)       循环展开,减少跳转指令,利用软件流水。

(3)       在读取数据时内嵌数据预取汇编指令,减少cache miss。

依据以上三个原则优化代码如下,相比memcpy,同样10M数据,在A9 750MHz, DDR频率528MHz下,耗时分别为28ms 和 40ms,性能提升30%,代码实现如下图3所示。

NEON在S2平台图像处理中的简单应用_第3张图片

图3 neon_memcpy代码实现

 

2.       中心镜像优化

典型的I420格式YUV数据C实现中心镜像代码如下图4所示。

NEON在S2平台图像处理中的简单应用_第4张图片

图4 中心镜像C代码

未被编译器优化的C代码实现均是按8bit一个像素一次处理,这样存在总线位宽未充分利用。利用neon中的反转向量元素指令,可单指令完成8个像素的镜像,大大提升了性能,按照这个原则修改后的代码在A9750 MHz,DDR 528MHz,耗时由30ms减少到18ms,另外原始代码中循环中有条件判断,不利于软件流水,故将uv的数据处理分开,提高软件流水,性能进一步提升由18ms提升到13ms,最终代码实现如下图5所示。

NEON在S2平台图像处理中的简单应用_第5张图片

图5 neon实现中心镜像

 

另外利用neon的交叉存储指令,通用移位、算法、乘法等指令,很容易实现最近邻插值、线性插值(2*2)缩放算法。

ARM的NEON协处理器技术是一个64/128-bit的混合SIMD架构,能应用于音视频处理应用中,针对目前SOC芯片音视频编解码、图像处理硬件化程度不断提高,在视频的智能处理、一些图像处理方面仍非常实用,特别在软件开发灵活性方面、产品差异化方面提供更多选择。

你可能感兴趣的:(嵌入式软件)