zoukankan      html  css  js  c++  java
  • NEON使用方法

    NEON介绍

    在移动平台上进行一些复杂算法的开发,一般需要用到指令集来进行加速。NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,专门针对大规模并行运算设计的,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。

    其本质上使用的是128位NEON SIMD寄存器,这意味着如果操作32位浮点数,可同时操作4个(变量可定义:float32x4_t);如果操作 16 位整数(short),可同时操作 8 个(变量可定义:int16x8_t);而如果操作 8 位整数,则可同时操作 16 个(变量可定义:int8x16_t)。

    ARMv7 NEON 指令集架构具有 16 个 128 位的向量寄存器,命名为 q0~q15。这 16 个寄存器又可以拆分成 32 个 64 位寄存器,命名为 d0~d31。其中qn和d2n,d2n+1是一样的,故使用汇编编写代码时要注意避免产生寄存器覆盖。如下图所示:

     NEON数据类型

    NEON的数据类型如下图:

     

    neon的数据类型float32x4_t 可以理解为vector< float32 > (4),同理typexN_t即为vector< type>(N)。在NEON编程中,对单个数据的操作可以扩展为对寄存器,也即同一类型元素矢量的操作,因此大大减少了操作次数。

    NEON中指令分为正常指令、宽指令、窄指令、饱和指令、长指令这几类:

    正常指令:数据宽度不变

     长指令:源操作数宽度相同 结果宽度扩展 L标记

     宽指令:源操作数宽度不同 结果宽度对齐 W标记

     窄指令:源操作数宽度相同 结果宽度变窄 N标记

    饱和指令:结果溢出就是饱和指令 Q标记

    NEON官方示例及详解

    通过一个示例来解释如何利用NEON内置函数来加速实现统计一个数组内的元素之和。

     对于长度为N的数组,上述算法的时间复杂度为O(N)。

    采用NEON函数进行加速:

     上述算法的时间复杂度为O(N/4),原因在于我们每次往寄存器加载4个float值,然后同时相加。相当于原来需要N次加法操作而现在只需要N/4即可。如果使用更多的寄存器,则可以完成更高倍数的加速。

    上述用到的几个NEON指令解释为:

     除以上的操作外,NEON还支持很多的操作,如矢量相减、矢量相乘、矢量乘加、矢量类型转换等等。

    NEON手册

    以下链接为NEON内置函数的手册,当需要用到某些NEON操作时,可以通过手册查看使用方法。
    NEON内置函数详细手册

     

     

  • 相关阅读:
    <<信息学奥赛一本通>> 昆虫养殖 题解
    C++ primer 第七章 练习7.35 类作用域练习
    C++ primer 第六章 练习6.56 函数指针练习
    P1145 约瑟夫
    C++ 查看auto delctype 后变量的类型。(小技巧)
    Educational Codeforces Round 24 题解
    HDU 5279 分治NTT 图的计数
    BZOJ 3473
    BZOJ 3514 LCT+主席树
    看无可看 分治FFT+特征值方程
  • 原文地址:https://www.cnblogs.com/fengliu-/p/14870938.html
Copyright © 2011-2022 走看看