1) RenderScript(GPU计算): 它是官方异构计算的Android API,从Android ICS 4.2开始,它启用GPU来进行计算;它实现了20多个滤波器(filters),支持CPU和GPU,且针对Mali-T600进行了优化。 (Nexus 10 <Mali-T604>)
2) OpenCL 1.1 (GPU计算):OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分区和数据分区的并行计算机制。
3) NEON(CPU计算):Ne10和math-neon都是基于NEON指令的数学库。
• Ne10:主要侧重于矩阵和向量的数学运算;
• math-neon:主要侧重于三角函数、对数、指数等复杂运算。
NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(Single Input Multiple Data:单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)
NEON 指令可执行“打包的 SIMD”处理:
• 寄存器被视为同一数据类型的元素的矢量
• 数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点
• 指令在所有通道中执行同一操作
Ne10是由ARM主导开发的一个开源软件库。该库旨在提供一系列通用的,基于ARM NEON架构并且经过深度优化的函数集合。通过调用该库函数可以让软件开发人员免于编写重复的底层汇编代码,同时也能充分利用ARM NEON SIMD((single instruction multiple data))指令的并行运算能力。Ne10主要包含math, dsp以及新添的imgproc三个功能模块:
1) math 数学模块:主要包含矢量/矩阵数学运算。
2) dsp 数字信号处理模块:主要包含FFT快速傅立叶变换,以及部分FIR/IIR滤波函数。
3) imgproc 图像处理模块:主要包含图像缩放,旋转等图像后处理函数。
Ne10 Lib的架构如下图所示,编译和使用方法见URL
OpenCL为程序员提供了控制并行计算设备的一些接口以及一些控制运算单元行为的类C编程语言。用户可以利用OpenCL接口开发并行度很高的程序,并且将其运行在GPU或其他处理设备上。
OpenCL是为那些想要编写出可移植高效程序的程序开发人员量身定做的。包括软件库开发人员、中间商和以提升性能为导向的程序开发者。OpenCL为他们提供了一个低级别硬件抽象层和一个编译框架来支持编程,OpenCL将许多并行硬件设备行为抽象为API来引导开发者进一步加速他们的程序。
1) kernels: 在一个或多个OpenCL设备上执行,kernels实例叫做work-item,支持以下两种kernels:
• OpenCL kernels: 使用OpenCL C语言编程,且使用OpenCL编译器编译。
• Native kernels: 通过host函数指针访问。
• Devices:可供host使用的所有OpenCL设备
• Kernels:运行在OpenCL设备上的OpenCL函数
• Program Objects:实现kernels的可执行程序代码
• Memeory Objects:Host和OpenCL设备都可见的内存对象,它包含可供kernel实例(work-item)操作的数据
OpenCL支持两种编和模型:data parallel和task parallel。驱动OpenCL设备的主要模型是:data parallel。
• 数据并行编程模型:同一个任务内,它的各个部分同时执行;数据并行才是GPU擅长的事。
• 任务并行编程模型:把一个问题分解为能够同时执行的多个任务;任务并行,不是GPU擅长的,与CPU相比完全无优势。
内存对象可分为以下两类:
• buffer对象:存储一维元素集合,其元素数据类型可为:int、float、vector或用户自定义的数据类型
• image对象:存储二维或三维纹理、frame-bufer或image
kernels把内存对象作为输入,并且在处理完之后,输出一个或多个内存对象。
• CPU:执行延迟敏感,串行为主的任务。
• GPU:执行带宽敏感,极度并行的任务。
在Android系统中,Native Code使用armeabi-v7a而不使用armeabi,以提高性能。