Qualcomm_Mobile_OpenCL.pdf 翻译-3

3 在骁龙上使用OpenCL

         在今天安卓操做系统和IOT(Internet of Things)市场上,骁龙是性能最强的也是最被普遍使用的芯片。骁龙的手机平台将最好的组件组合在一块儿放到了单个芯片上,这样保证了基于骁龙平台的设备将带来极致的功耗效率和集成的解决方案,从而带来最新的手机用户体验。数组

        

         骁龙是一个多处理器系统,包含好比多模解调器(multimode modem),CPU,GPU,DSP,位置/GPS,多媒体,电源管理,RF,针对软件和操做系统的优化,内存,可链接性(Wi-Fi,蓝牙)等。缓存

 

         若是想了解当前包含骁龙处理器的消费设备清单,或者想知道关于骁龙处理器更多其余方面的内容,请浏览网站 http://www.qualcomm.com/snapdragon/devices。Adreno GPUs 通常在渲染图像的应用程序中使用,同时它也拥有通常处理器的处理大量计算复杂的任务的能力,好比图像和音频的处理、计算视觉。使用OpenCL执行数据并行的计算可以充分发挥GPU的能力。架构

 

3.1在骁龙上使用OpenCL

         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获取完整的设备细节信息。

        

3.2 Andreno GPU架构

         这章将从高层次的角度整体介绍一下Adreno中与OpenCL相关的架构。

3.2.1 与OpenCL相关的Adreno的架构

 

         图3-1 A5x GPUs 中与OpenCL相关的架构

 

         Adreno GPUs支持许多图像和计算API,包括OpenGL ES,OpenCL,DirectX和Vulkan等。图3-1阐述了与OpenCL相关的Andreno A5x硬件整体架构,其中省略了图像相关的硬件模块。A5x和其余Andreno系列的GPU有许多不一样,可是在OpenCL上的差别很小。

         执行OpenCL的关键硬件模块以下:

  •   SP ( Shader or Streaming processor 着色或者流媒体处理器(图像渲染的相关名词))
    • Andreno GPU的核心部分。包含了许多硬件模块,包括算术逻辑单元(ALU),装载/存储单元,控制流单元,寄存器文件等。
    • 执行图像的着色程序(好比三角着色,片断着色,计算着色)(图像渲染中使用的)和执行计算任务好比OpenCL kernels。
    • 每个SP对应一个或者多个OpenCL的计算单元。
    • 根据GPU的系列和等级不一样,Adreno GPUs可能包含一个或者多个SP。低级的芯片组可能只有一个SP,高级的芯片组可能有更多的SP。在图3-1中,只有一个SP。
    • 对于使用__read_write (OpenCL2.0的特性)限定词定义的缓冲区对象和图片对象,SP将经过L2缓存装载和存储。
    • 对于只读的图像对象,SP经过texture processor/L1 模块来装载数据。
  • TP(Texture processor 纹理处理器(图像渲染的相关名词)
    • 执行纹理操做,好比基于内核的请求进行纹理的获取和过滤。
    • TP是与L1 cache结合在一块儿,当出现纹理数据缓冲区未命中时,L1 cache从UCHE(Unified L2 Cache下面讲)中获取数据。
  •  Unified L2 Cache(UCHE)
    •  负责为SP从缓冲区Buffer对象)对象存储/装载数据,负责为L1 cache请求装载图像对象(Image对象)。(如图3-1,就当SP请求从缓冲区装载/存储数据,经过UCHE ,当L1 cache请求装载图像对象时,经过UCHE

      3.2.2 Waves 和 fibers(高通内部定义的概念,直接用英文,具体意义会在章节中详细解释)

         在Adreno GPUs中,最小的执行单元叫fiber。一个fiber对应OpenCL中的一个work item(工做项,opencl中的概念,由于代码中也会常常用到,因此直接用英文表示)。以“固定步调”一块儿运行的一组fiber叫作wave。SP能够同时容纳多个已经激活的wave。每个wave与前面的程序独立,而且与其余waves的运行状态无关。须要注意如下几点:

  •  wave的大小,或者说是在一个wave中fbers的数量,对于指定的GPU和kernel,这个数量固定的。GPU给出最大值,kernel函数给出当前须要运行的值)
  •  在Adreno GPU中,wave的大小依赖于GPU的系列和编译器,通常值是8,16,32,54,128等。
  • 一个workgroup(工做组,opencl中的概念)能够被一个或者多个waves执行,这主要由workgroup的大小决定。好比说,若是一个workgroup的大小小于或者等于wave的大小,只须要一个wave就能够。固然越多的wave固然越好,由于wave之间可以更好地隐藏延迟。(像cpu上的流水线,好比一个wave执行完load数据,开始计算,另外一个wave就能够开始执行load数据操做。这样第二个wave的load操做时间就被隐藏了。)
  • SP能够在一个或者多个waves上同时执行ALU指令。
  • 在一个workgroup中,能够流水线运行的最大的wave的个数是由硬件决定的。典型的,Adreno GPUs支持16个waves。
  • 给定一个kernel函数,在一个SP上能激活的最大waves的个数是由kernel的寄存器占用和寄存器文件的大小决定(就是虽然硬件最大支持16个waves同时运行,可是若是kernel函数占用寄存器过多,寄存器不够用,可能只有8个waves同时运行),同时也由GPU的系列和等级决定。
  • 通常地,kernel函数越复杂,可激活的waves越小。(这里提供了优化思路,将复杂的kernel函数拆成多个简单的kernel函数,可以提升并行速度)
  • 给定一个kernel函数,最大的workgroup大小是wave的大小和容许的wave的最大个数的乘积。

         OpenCL 1.x的文档中并无暴露wave上的概念,在OpenCL2.0中,已经容许应用程序经过cl_khr_subgroups扩展功能使用wave,不过是从Adreno A5x GPU开始支持的。

        

      3.2.3延迟隐藏

         延迟隐藏是GPU有效并行化处理中最强大的一个特色,使得GPU达到一个很高的吞吐量。举例以下:

  • SP开始执行第1个wave。
  • 在执行完几个ALU指令后,这个wave须要从外存中(多是全局/本地/私有内存)获取更多的数据进行接下来的处理,而这些数据当前没有获取到。
  • SP为这个wave发送数据获取数据请求。
  • SP切换到已经准备好的第2个wave开始执行。
  • SP继续执行第2个wave,直到第2个wave依赖的内容(好比数据或者寄存器之类)没有准备好。
  • SP 可能会切换到第3个wave,或者切回到第1个wave执行,若是第一个wave已经可执行(数据已经获取到)的话。

         在这种方式下,SP一直处于很是忙碌的状态,并且就像是所有时间都在工做,或者说外部依赖项已经被很好隐藏了。

 

    3.2.4 workgroup的分配

         一个典型的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。

3.3 Adreno A3x,A4x 和A5x在OpenCL上的不一样点

         每个新的Adreno GPU系列将会在OpenCL的特性和性能上带来很大的提高。这一章将讨论影响OpenCL性能的关键改变。

      3.3.1 L2 cache

         从Adreno A320和Adreno 330 GPUs 到Adreno A420, A430,A530 和A540 GPUs,为了更好的效率和性能,L2 cache的架构进行了极大的改进,同时还增长了L2 cahe的容量。

      3.3.2 Local memory本地内存

         从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 非合并访问

 

      3.4 图像和计算任务之间的上下文切换

      3.4.1 上下文切换

         在Adreno GPUs中,若是一个高优先级的任务,好比图像用户界面(UI)渲染进行了请求,同时一个低优先级任务正在GPU上运行,那么后者将会被暂停,而后GPU切换到高优先级的任务上执行。当高优先级的任务执行完毕,低优先级的任务将会被恢复。这种任务的切换叫作上下文切换。上下文切换是很是耗时的,由于须要复杂的硬件和软件操做。然而,这又是很重要的一个特性,可以使得紧急的和对时间要求严格的任务及时完成,好比自动类的应用程序。

      3.4.2  限制kernel/workgroup在GPU上的执行时间

         有时候,一个计算任务的kernel函数可能会执行一段时间,或者可能会触发一个警告而致使GPU重启。为了不这些不可预测的行为,并不建议kernel函数中有须要长时间才能完成的workgroup。一般状况下,在Android设备上,UI渲染常常发生,好比每30 ms,因此一个长时间运行的kernel可能会引发UI滞后或者没有响应,从而致使用户体验很差。理想的kernel执行时间是根据实际状况而定的。不过,一个比较好的通用准则是,一个kernel的执行时间应该在10ms的数量级上。

 

      3.5 OpenCL 标准上的相关提高

         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++ 原子操做

不支持

不支持

支持

 

 

      3.6 OpenCL扩展

         除了支持OpenCL的核心功能外,Adreno OpenCL平台还经过扩展支持许多额外的功能特性,从而可以进一步提升了OpenCL的可用性和可以充分使用Adreno GPU的先进的硬件能力。指定Adreno GPU上可用的扩展功能能够经过函数clGetPlatformInfo函数查询。扩展功能的文档能够在QTI开发者网页上获取。(网址 https://developer.qualcomm.com)

相关文章
相关标签/搜索