在今天安卓操做系统和IOT(Internet of Things)市场上,骁龙是性能最强的也是最被普遍使用的芯片。骁龙的手机平台将最好的组件组合在一块儿放到了单个芯片上,这样保证了基于骁龙平台的设备将带来极致的功耗效率和集成的解决方案,从而带来最新的手机用户体验。数组
骁龙是一个多处理器系统,包含好比多模解调器(multimode modem),CPU,GPU,DSP,位置/GPS,多媒体,电源管理,RF,针对软件和操做系统的优化,内存,可链接性(Wi-Fi,蓝牙)等。缓存
若是想了解当前包含骁龙处理器的消费设备清单,或者想知道关于骁龙处理器更多其余方面的内容,请浏览网站 http://www.qualcomm.com/snapdragon/devices。Adreno GPUs 通常在渲染图像的应用程序中使用,同时它也拥有通常处理器的处理大量计算复杂的任务的能力,好比图像和音频的处理、计算视觉。使用OpenCL执行数据并行的计算可以充分发挥GPU的能力。架构
Adreno A3x,A4x 和A5x 系列的GPUs 已经能充分支持OpenCL,而且已经彻底符合OpenCL标准。OpenCL有不一样的版本和profiles,因此不一样系列的Anreno GPUs可能支持不一样的OpenCL版本,如表3-1所示:函数
表3-1 支持OpenCL的Adreno GPUS布局
GPU 系列性能 |
Adreno A3x优化 |
Adreno A4x网站 |
Adreno A5xspa |
OpenCL version操作系统 |
1.1 |
1.2 |
2.0 |
OpenCL profile |
Embedded |
Full |
Full |
除了支持的OpenCL的版本和profiles不一样以外,不一样的Adreno GPUs还可能有其余的不一样的性质,好比支持的扩展功能不一样,支持的图片对象最大维度不一样等。能够经过调用API函数clGetDeviceInfo获取完整的设备细节信息。
这章将从高层次的角度整体介绍一下Adreno中与OpenCL相关的架构。
图3-1 A5x GPUs 中与OpenCL相关的架构
Adreno GPUs支持许多图像和计算API,包括OpenGL ES,OpenCL,DirectX和Vulkan等。图3-1阐述了与OpenCL相关的Andreno A5x硬件整体架构,其中省略了图像相关的硬件模块。A5x和其余Andreno系列的GPU有许多不一样,可是在OpenCL上的差别很小。
执行OpenCL的关键硬件模块以下:
在Adreno GPUs中,最小的执行单元叫fiber。一个fiber对应OpenCL中的一个work item(工做项,opencl中的概念,由于代码中也会常常用到,因此直接用英文表示)。以“固定步调”一块儿运行的一组fiber叫作wave。SP能够同时容纳多个已经激活的wave。每个wave与前面的程序独立,而且与其余waves的运行状态无关。须要注意如下几点:
OpenCL 1.x的文档中并无暴露wave上的概念,在OpenCL2.0中,已经容许应用程序经过cl_khr_subgroups扩展功能使用wave,不过是从Adreno A5x GPU开始支持的。
延迟隐藏是GPU有效并行化处理中最强大的一个特色,使得GPU达到一个很高的吞吐量。举例以下:
在这种方式下,SP一直处于很是忙碌的状态,并且就像是所有时间都在工做,或者说外部依赖项已经被很好隐藏了。
一个典型的OpenCL kernel须要用到多个workgroup。在Adreno GPU中,每个workgroup被分配给一个SP,通常地,在同一时间内每个SP只能运行一个workgroup。若是有剩下的workgroup,会在GPU中排队等待执行。
用图3-2所示的2维workgroup为例,并假设该GPU有4个SP。图3-3表示了这些workgroup如何被分配到不一样的SP上。在这个例子中,共有9个workgroup,而且每个都由一个SP上执行。每个workgroup有4个wave,wave的大小是16.
图3-2 workgroup的布局和分派到在Andreno GPU上执行的例子
图3-3 workgroup被分配到SP上执行的例子
OpenCL标准既没有定义workgroup启动和执行的顺序,也没有定义workgroup之间的同步机制。对于Adreno GPUs,开发者不能假设workgroup在SP上按照指定的顺序启动。一样地,wave也不能假设按照指定的顺序启动。
在大部分的Adreno GPUs中,一个SP在同一个时间只能运行一个workgroup,并且一个workgroup必须完成后,另外一个workgroup才能开始。可是在更高级和更新的GPU系列中,好比Adreno A540 GPU,一个SP上能够执行多个workgroup。
每个新的Adreno GPU系列将会在OpenCL的特性和性能上带来很大的提高。这一章将讨论影响OpenCL性能的关键改变。
从Adreno A320和Adreno 330 GPUs 到Adreno A420, A430,A530 和A540 GPUs,为了更好的效率和性能,L2 cache的架构进行了极大的改进,同时还增长了L2 cahe的容量。
从Adreno A3x 到A4x 和A5x 系列,Local memory在容量,装载/存储吞吐量和合并访问(coalesced access)上有所提高。表3-2表示了在不一样系列上合并访问的不一样点。
表3-2 本地内存性能总结
GPUs |
Adreno A3x |
Adreno A4x |
Adreno A5x |
合并访问 |
不支持 |
不支持 |
支持,每次操做能够由最多4个work item装载/存储128位。 |
合并访问是OpenCL和GPU并行计算中的一个重要概念。从本质上说,它指的是,基础硬件可以将多个work item的数据装载/存储请求合并成一个请求,从而提高数据的装载/存储效率。若是没有合并访问的支持,硬件必须针对每一个单独的请求进行装载和存储的操做,这将会致使较差的性能。
图3-4 阐述了合并访问和非合并访问之间的不一样。为了可以将多个work items的请求结合在一块儿,请求的数据地址必须是连续的。在合并访问中,Adreno GPUs可以在一次处理中给4个work items装载数据,而非合并访问中,须要4次处理才可以装载一样数量的数据。
图3-4 数据装载中合并访问 vs 非合并访问
在Adreno GPUs中,若是一个高优先级的任务,好比图像用户界面(UI)渲染进行了请求,同时一个低优先级任务正在GPU上运行,那么后者将会被暂停,而后GPU切换到高优先级的任务上执行。当高优先级的任务执行完毕,低优先级的任务将会被恢复。这种任务的切换叫作上下文切换。上下文切换是很是耗时的,由于须要复杂的硬件和软件操做。然而,这又是很重要的一个特性,可以使得紧急的和对时间要求严格的任务及时完成,好比自动类的应用程序。
有时候,一个计算任务的kernel函数可能会执行一段时间,或者可能会触发一个警告而致使GPU重启。为了不这些不可预测的行为,并不建议kernel函数中有须要长时间才能完成的workgroup。一般状况下,在Android设备上,UI渲染常常发生,好比每30 ms,因此一个长时间运行的kernel可能会引发UI滞后或者没有响应,从而致使用户体验很差。理想的kernel执行时间是根据实际状况而定的。不过,一个比较好的通用准则是,一个kernel的执行时间应该在10ms的数量级上。
Adreno A3x GPU支持OpenCL 1.1 的嵌入式版profile,Adreno A4x GPU支持OpenCL 1.2的完整版,Andreno A5x GPU上支持OpenCL 2.0 完整版。
从OpenCL 1.1 的嵌入式版profile到OpenCL 1.2的完整版,主要的改变是在软件上,而不是在硬件上,好比提高了API函数。
不过,从OpenCL 1.2 的完整版到OpenCL 2.0的完整版,引进了许多新的硬件特性,好比SVM(共享的虚拟内存),kernel-enqueue-kernel,等。表3-3 列出了3个Adreno系列的GPU上,在OpenCL支持上的不一样点。
表3-3 在Adreno GPU上的支持的标准OpenCL的特性
特性 |
Adreno A3x支持的嵌入式OpenCL1.1 |
Adreno A4x 支持的彻底OpenCL1.2 |
Adreno A5x支持的完整OpenCL2.0 |
分开编译和连接对象 |
不支持 |
不支持 |
支持 |
舍入模式 |
舍入为0 |
舍入到最接近的偶数 |
舍入到最接近的偶数 |
kernel中编译 |
不支持 |
支持 |
支持 |
1维的纹理,1维/2维的图片数组 |
不支持 |
不支持 |
支持(仅在合并获取时) |
共享虚拟内存 |
不支持 |
不支持 |
支持 |
管道 |
不支持 |
不支持 |
支持 |
转载/存储图像 |
不支持 |
不支持 |
支持 |
嵌套并行 |
不支持 |
不支持 |
支持 |
KEK(Kernel-enqueue-kernel) |
不支持 |
不支持 |
支持 |
通用内存空间 |
不支持 |
不支持 |
支持 |
C++ 原子操做 |
不支持 |
不支持 |
支持 |
除了支持OpenCL的核心功能外,Adreno OpenCL平台还经过扩展支持许多额外的功能特性,从而可以进一步提升了OpenCL的可用性和可以充分使用Adreno GPU的先进的硬件能力。指定Adreno GPU上可用的扩展功能能够经过函数clGetPlatformInfo函数查询。扩展功能的文档能够在QTI开发者网页上获取。(网址 https://developer.qualcomm.com)