异构计算(Heterogeneous Compute)

1. 异构计算接口

    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:主要侧重于三角函数、对数、指数等复杂运算。 

1.1 NEON

      NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(Single Input Multiple Data:单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)
      NEON 指令可执行“打包的 SIMD”处理:
        • 寄存器被视为同一数据类型的元素的矢量
        • 数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点
        • 指令在所有通道中执行同一操作 

异构计算(Heterogeneous Compute)_第1张图片

1.2 Ne10

      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

异构计算(Heterogeneous Compute)_第2张图片

1.3 OpenCL

      OpenCL为程序员提供了控制并行计算设备的一些接口以及一些控制运算单元行为的类C编程语言。用户可以利用OpenCL接口开发并行度很高的程序,并且将其运行在GPU或其他处理设备上。

1.3.1 OpenCL为程序员提供了平台独立性

  如今大部分的高端的计算系统基本上都引入了高性能的CPU,GPU和其它类型的处理器。这就为软件开发提出了内在的要求,即必须保证编写的软件能够在各种异质平台上自由移植,并且能充分而合理的利用到整个计算机系统的所有计算资源。
  OpenCL正是为满足用户的这个要求而设计的。它应用范围广泛,从嵌入式消费类软件的开发到高性能计算解决方案,都可以通过其完成。OpenCL具有一个底层程序接口,和一个高性能,可移植的抽象层,它为并行计算提供了一个有限的开发环境,一个平台独立的工具和丰富的中间软件层。
  通过传统的方法开发一个运行在异质平台,例如包括多核CPU和GPU的平台,并行运算程序是十分困难的。传统的基于多核CPU架构的并行计算程序会假设地址空间在计算过程中是始终共享的,GPU并计算模型则有着非常杂的内存层次和矢量操作,并且不同平台,不同产品信号的GPU往往有着不同的架构。这些限制使得软件开发人员很难开发出一款能高效的运用各种异质平台计算资源的软件。
  OpenCL标准的诞生为软件开发人员能够高效利用各种异构处理平台提供了充分保障,从高性能计算服务器,到家用计算机系统内核,再到手持设备,从高端GPU,高端多核CPU到DSP,和Cell/B.E.processor。OpenCL支持各种各样的并行处理器的组合平台。
OpenCL会将各类计算设备组织成一个统一的平台。OpenCL不仅仅是一门编程语言,更是一个完整的并行编程框架 ,它包括编程语言、API、函数库及运行时系统来支持软件在整个平台上的开发。

  OpenCL是为那些想要编写出可移植高效程序的程序开发人员量身定做的。包括软件库开发人员、中间商和以提升性能为导向的程序开发者。OpenCL为他们提供了一个低级别硬件抽象层和一个编译框架来支持编程,OpenCL将许多并行硬件设备行为抽象为API来引导开发者进一步加速他们的程序。

1.3.2 OpenCL家族图谱

异构计算(Heterogeneous Compute)_第3张图片


1.3.3 OpenCL架构

1.3.3.1平台模型Platform Model

        
  

1.3.3.2内存模型Memory Model

       work-item(s)执行一个kernel可访问以下四类内存区域:
        • Global Memory:所有work-groups中的的所有work-items都可读/写的内存区域;
        • Constant Memory:在kernel执行过程中,它保存常量的Global Memory,host分配并初始化此内存对象;
        • Local Memory:隶属于work-group的本地内存区域,可供work-group中的所有work-items分配共享变量,可作为OpenCL设备的专用内存区域,也可被映射到Global Memory;
        • Private Memory:隶属于一个work-item的私有内存区域,如定义在work-item中的变量。

异构计算(Heterogeneous Compute)_第4张图片  

异构计算(Heterogeneous Compute)_第5张图片



1.3.3.3 执行模型Execution Model

     OpenCL程序的执行包含两部分:

     1) kernels: 在一个或多个OpenCL设备上执行,kernels实例叫做work-item,支持以下两种kernels:

        • OpenCL kernels: 使用OpenCL C语言编程,且使用OpenCL编译器编译。
        • Native kernels: 通过host函数指针访问。

     2) host program: 在host上执行;它定义kernels的环境(context)并管理kernels的执行,context包含以下四要素:

        • Devices:可供host使用的所有OpenCL设备
        • Kernels:运行在OpenCL设备上的OpenCL函数
        • Program Objects:实现kernels的可执行程序代码
        • Memeory Objects:Host和OpenCL设备都可见的内存对象,它包含可供kernel实例(work-item)操作的数据   
  

1.3.3.4 编程模型Programming Model

       OpenCL支持两种编和模型:data parallel和task parallel。驱动OpenCL设备的主要模型是:data parallel。

     • 数据并行编程模型:同一个任务内,它的各个部分同时执行;数据并行才是GPU擅长的事。
     • 任务并行编程模型:把一个问题分解为能够同时执行的多个任务;任务并行,不是GPU擅长的,与CPU相比完全无优势。

1.3.3.5 内存对象Memory Objects

    内存对象可分为以下两类:
     • buffer对象:存储一维元素集合,其元素数据类型可为:int、float、vector或用户自定义的数据类型
     • image对象:存储二维或三维纹理、frame-bufer或image

       kernels把内存对象作为输入,并且在处理完之后,输出一个或多个内存对象。

1.3.3.6 OpenCL框架OpenCL Framework

     OpenCL框架允许应用程序使用一个host和一个或多个OpenCL设备组成一个单一的异构并行计算系统,它包含以下几个组件:
     • OpenCL Platform Layer:它允许host程序发现OpenCL设备及设备的能力,然后创建context
     • OpenCL Runtime:它允许host程序操作context
     • OpenCL Compiler:OpenCL编译器创建包含OpenCL kernels的可执行程序。


2. CPU与GPU的比较

异构计算(Heterogeneous Compute)_第6张图片

   • CPU:执行延迟敏感,串行为主的任务。

   • GPU:执行带宽敏感,极度并行的任务。

   在Android系统中,Native Code使用armeabi-v7a而不使用armeabi,以提高性能。

2.1 OpenGL ES画图流程



2.2 性能瓶颈









你可能感兴趣的:(异构计算(Heterogeneous Compute))