Profiling and NEON Optiomization

78 阅读2分钟

之前的章节主要关注如何开发native应用。学习了Android平台和Linux平台提供的各种native API。接下来主要关注:

  1. 通过GNU Profiler分析Android native应用,找到性能瓶颈
  2. 通过ARM NEON 的编译器内置函数优化native应用
  3. 通过编译器的自动向量化支持在不改变代码的前提下优化应用性能

GNU Profiler测量性能

GNU Profiler(又叫做gprof)是一个UNIX-based分析工具。通过插入额外代码(仪器化)和采样,gprof可以收集和上报每个方法的具体执行时间。仪器化是通过GNU C/C++编译器的-pg选项在编译期间完成的。在执行应用期间,采样数据被自动保存在gmon.out数据文件中,后续gprof可以根据这个文件生成报告。Android NDK包含gprof工具,但是NDK中GNU C/C++编译器工具链缺少测量方法执行时间的`_gnu_mcount_nc`方法实现。

使用ARM NEON内置函数优化性能

ARM NENO技术简介

ARM处理器中单指令多数据(SIMD:single instruction, multi data)的实现叫做NEON。SIMD同时在多个数据上实现同一个操作。SIMD可以以此实现性能优化。多媒体应用经常受益于SIMD技术,因为这类应用经常在大量的数据上做同一种操作,例如视频帧或者音频块。NEON在大多数ARM Cortex-A上都有实现。

NEON技术中,数据被放置于64-bit的D 寄存器或者128位的Q寄存器中。这些寄存器可以存放8-,16-,32-,64-bit位宽的向量数据。

NEON也提供了相关指令集合用于操作这些数据向量。

自动向量化

使用ARM NEON能够很好的改善应用性能,但是这依赖于ARM assemble language和NEON 指令集的使用。NEON是专用于ARM的SIMD。为了支持更多CPU架构,例如x86或者MIPS,就需要实现对应的SIMD方法例如Intel SSE或者MIPS MDMX。

通过汇编语言和指令支持SIMD并不是唯一的方法。在多数情况下GNU C/C++编译器能够根据代码自动优化SIMD。这个过程就是自动向量化。