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 位单精度浮点
        • 指令在所有通道中执行同一操作

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

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家族图谱

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中的变量。

 

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的比较

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

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

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

2.1 OpenGL ES画图流程

2.2 性能瓶颈

异构计算(Heterogeneous Compute)相关推荐

  1. (转) Exploring How Cache Coherency Accelerates Heterogeneous Compute

    Long Time No See! 转载自:https://community.arm.com/developer/ip-products/processors/b/processors-ip-blo ...

  2. 详解高性能计算中的异构计算

    当摩尔定律还是行业的铁律时,计算机编程几乎一直都是串行的,绝大多数的程序只存在一个进程或线程.大家还过着"我写个程序,性能达不到就睡个觉,等硬件工艺刷新硬件性能,性能就达标了"的美 ...

  3. ai芯片fpga_AI芯片技术趋势景观GPU TPU FPGA初创公司

    ai芯片fpga Major tech companies invest billions in AI chip development. Even Microsoft and Facebook ar ...

  4. AMD ROCm 平台简介

    最近,AMD 发布 MIOpen.至此,AMD 始于15年的打造 GPU 计算生态的 Boltzmann Initiative,有了阶段性的成果. 下面本文从深度学习计算的视角来审视一下 AMD 推出 ...

  5. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)

    在下载目录下解压 heqin@heqin-dell:~/Downloads$ tar zxvf parallel_studio_xe_2017_update7.tgz 进入解压后的文件夹 heqin@ ...

  6. 深度解析:CPU与GPU有什么区别?xPU又是什么鬼?

    先了解什么是异构并行计算 同构计算是使用相同类型指令集和体系架构的计算单元组成系统的计算方式. 而异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式,常见的计算单元类别包括CPU ...

  7. OpenCL Programming Guide - OpenCL 编程指南 - 书中源代码

    OpenCL Programming Guide - OpenCL 编程指南 - 书中源代码 1. Heterogeneous Compute http://www.heterogeneouscomp ...

  8. 异构系统架构标准——HSA

    前几天看到一则新闻AMD发新Carrizo处理器http://digi.tech.qq.com/a/20150603/009450.htm .这是第一个完整支持HSA1.0标准的产品.因为当时HSA是 ...

  9. 一个工程师的“噩梦”:刚分清CPU、GPU,却发现还有更多...

    01 先了解什么是异构并行计算 同构计算是使用相同类型指令集和体系架构的计算单元组成系统的计算方式. 而异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式,常见的计算单元类别包括 ...

最新文章

  1. 论计算机的创新性,论计算机专业教学创新探索
  2. href 和 src 的区别
  3. spring mvc 中对静态资源的访问配置
  4. 使用react开发管理后台
  5. 分享java web 期末项目实验源码20套,BBS论坛,ERP管理系统,OA自动化等等
  6. Android添加程序背景颜色,Android小程序实现切换背景颜色
  7. tornadod的异步代码
  8. Atitit.软件仪表盘(7)--温度监测子系统--电脑重要部件温度与监控and警报
  9. MySQL5及更高版本的jar包下载(jdbc)及常见问题解决
  10. 电瓶车换电柜的静电浪涌设计考虑
  11. 如何将PayPal中的美元以人民币的形式提现到建设银行卡中?
  12. Minecraft Mod 开发:0-前言
  13. 关于UNI-APP微信小程序订阅信息订阅获取失败的问题处理
  14. 图文详解双向链表原理
  15. 如何将FLV格式视频转换成高清MP4格式方法
  16. 从视频中截取图像opencv python
  17. Facebook pop
  18. 怎样设计才能让文字排版更好看(一)
  19. python文本分类算法_基于Naive Bayes算法的文本分类
  20. 服务器文件夹temp,服务器性能变慢 c盘temp文件夹存在大量sess开头文件的问题原因及解决...

热门文章

  1. 【数学】丑数II 和 超级丑数
  2. 06-python中的集合类-01
  3. Scratch2的鸡兔同笼
  4. Common Vector Operators(常见的向量操作)
  5. Config语言与Config.in文件
  6. 徐汉彬:Web系统大规模并发——电商秒杀与抢购
  7. CreateEvent
  8. 【转载】财务自由有多重要?
  9. centos升级gdb支持pretty-printer
  10. 读我(Readme)