NEON优化:性能优化常见问题QA

NEON优化:性能优化常见问题QA

NEON优化系列文章:

  1. NEON优化1:软件性能优化、降功耗怎么搞?link
  2. NEON优化2:ARM优化高频指令总结, link
  3. NEON优化3:矩阵转置的指令优化案例,link
  4. NEON优化4:floor/ceil函数的优化案例,link
  5. NEON优化5:log10函数的优化案例,link
  6. NEON优化6:关于交叉存取与反向交叉存取,link
  7. NEON优化7:性能优化经验总结,link
  8. NEON优化8:性能优化常见问题QA,link

本文将日常遇到的NEON优化问题总结记录于此。

CPU主频Mhz和开销MCPS的关系是啥?

  • 主频Mhz并不直接代表运算速度MCPS
  • 主频:1.8GHz=1800MHz,也即理论最大1800MCPS,主频是开销计算的理论天花板

功耗与开销的关系?

  • 通常开销指的时间复杂度开销,多少M开销的变化,对应多少mA功耗的变化,由于涉及到硬件优化及具体器件性能,无法理论计算出来。

软仿的MIPS数和硬仿的MIPS数差异以及MCPS?

  • CPU情况不一样,软仿最多CPI为1,也即一般MCPS会比MIPS大。但手机的芯片比较牛,能做到CPI<1.

armv7/armv8a,arm64-v7/arm64-v8a的区别?Cortex-A9/A8/A53/A55的区别?

  • 首先,armv7/v8是Architecture架构,cortex是具体的processor处理器,架构几年甚至十年一更新,处理器年年都翻新。

  • 其次,对armv7-A/armv8-A/armv8-M分类划定

    • 总体

      • v7/v8表示第几代
      • -A/-M/-R表示Application/Microcontroller/Real-time,适配手机电脑、嵌入式设备等不同平台
      • v8-a,2011年发布,armv8-a后的a跟cortex-a是对应一致的
    • armv8-a架构

      • 有32也有64位,32位processor:cortex-a32;64位processor:cortex-a34/cortex-a53;
    • armv7-a架构

      • 只有32位,对应processor:cortex-a5/a7/…/a17
  • 更多细节见:wiki

什么是MCPS?

  • MCPS,每秒百万次周期,衡量时间开销的指标
  • MIPS,每秒百万条指令数,一般一条指令对应一个或多个计算周期,故通常MIPS比MCPS数据小

向量线和N元素结构是什么意思?

  • 向量线数,相当于1个NEON寄存器里有多少个对应基础数据类型值(int16/uint32/float32等)。
  • n元素结构,相当于n个NEON寄存器。

NEON指令中有的加q,有的不加q,有何区别?

  • 操作符后的q,如vmulq, 表示128位满位宽寄存器运算
  • v后的q,如vqrdmulh,q表示饱和运算,溢位后,为自动限制在数据类型的最大范围内。
    • rdmul表示向量与标量进行加倍乘运算的具体操作意义。
    • hq表示高位饱和,lq表示低位饱和。

NEON中的正常指令、宽指令、窄指令、饱和指令、长指令分别指什么?

  • 正常指令:生成大小相同且类型通常与操作数向量相同到结果向量
  • 长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型。L标记,如VMOVL。
  • 宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。
  • 窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。
  • 饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记,如VQSHRUN

NEON变量的命名规则是什么?

  • 没有统一的规则,如果想要规范些,可采用以下命名方式。

  • 变量类型 变量名:vTNnVar

    • 解释

      • v,表示向量运算
      • T,表示变量的类型,分别用s表示有符号整型,u表示无符号整型,f表示浮点
      • N,表示变量元素所占位宽,如s32,u16,f32中的数字即N,表示元素占位
      • n,表示向量线元素结构,如x4,x4x2
      • Var,表示变量自定义的名字
    • 举例

      • 定义:int16x4x2_t vs16x4x2Tmp;

      • 解释:元素为int16,存4x2的二维向量(注意2是行,4是列,从后往前套壳),即val[0]/val[1]分别存4个向量线,变量名为tmp

      • 详细:

        • vs16x4x2Tmp变量名的v表示vector,s16表示16位有符号数,x4表示4个向量线,x2表示2个元素,Tmp为实际变量名。

        • 两个元素分别是vs16x4x2Tmp.val[0]和vs16x4x2Tmp.val[1],其类型就是int16x4,4个向量线分别存着四个数据,且是从连续内存交叉读取写入到vs16x4x2Tmp中的。

        • 比如:

          short tmp[8] = {0 1 2 3 4 5 6 7};
          vs16x4x2Tmp = vld2q_s16(tmp); 
          // 得到的结果是
          vs16x4x2Tmp.val[0]: 0 2 4 6
          vs16x4x2Tmp.val[1]: 1 3 5 7
          
      • 定义:float32x2_t vf32x2Tmp;

      • 解释:元素为float32,存两个元素的一维向量,变量名为tmp

NEON变量中的.val[0]/.val[1]表示什么?

  • 代表数据类型对应的向量线结构,分别索引寄存器所对应的数值。

查看反汇编代码时,如何判断代码是否存在互锁?

  • 在rvds中,查看反汇编代码,选中一段原始C代码,会自动对应相应的反汇编代码,如果CPI旁边那列存在黑点,则表示代码间存在互锁。

你可能感兴趣的:(经验总结,性能优化,NEON指令)