Snapdragon上的OpenCL介绍 (1)

46 篇文章 22 订阅

3 Snapdragon上使用OpenCL

Snapdragon是当今Android操作系统和物联网(IOT)市场上功能最强大且使用最广泛的移动平台之一。 Snapdragon移动平台将一流的移动组件集成在单个芯片上,从而确保基于Snapdragon的设备以极其省电的集成解决方案提供最新的移动用户体验。

Snapdragon是一个多处理器系统,包括多模式调制解调器,CPU,GPU,DSP,定位/ GPS,多媒体,电源管理,RF,软件和操作系统优化,内存,连接性(Wi-Fi,蓝牙)等组件。

有关包括Snapdragon处理器的当前商用设备的列表,以及有关Snapdragon处理器的更多信息,请访问http://www.qualcomm.com/snapdragon/devices。 一般来说Snapdragon处理器中的Adreno GPU用于渲染图形应用程序,它也是功能强大的通用处理器,能够处理许多计算量大的任务,例如图像和视频处理以及计算机视觉。 使用OpenCL可以利用GPU的功能来执行数据并行计算。

3.1 在Snapdragon上使用OpenCL

Adreno A3x,A4x和A5x GPU完全支持OpenCL,并且完全符合OpenCL标准。 OpenCL具有不同的版本和配置文件,并且不同的Adreno GPU可能支持不同的OpenCL版本,如表3-1所示。
在这里插入图片描述除了OpenCL版本和配置文件的差异之外,Adreno GPU之间还有其他属性可能会有所不同,例如支持的扩展名和图像对象的最大尺寸等。详细信息的完整列表可以通过调用OpenCL API函数clGetDeviceInfo获得。

3.2 Adreno GPU架构

本节概述了与OpenCL相关的Adreno架构。

3.2.1适用于OpenCL的Adreno高级架构

在这里插入图片描述Adreno GPU支持许多图形和计算API,包括OpenGL ES,OpenCL,DirectX和Vulkan等。图3-1说明了OpenCL的Adreno A5x硬件体系结构的高级视图,其中跳过了与图形相关的硬件模块 。 A5x与其他Adreno GPU之间存在许多差异,而对于OpenCL,差异则相对较小。

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

  • 着色器(或流式)处理器(SP)
  1. Adreno GPU的核心模块。 包含许多硬件模块,包括算术逻辑单元(ALU),加载/存储单元,控制流单元,寄存器文件等。
  2. 它执行图形着色器(例如,顶点着色器,片段着色器和计算着色器)以及计算工作负载,例如OpenCL内核。
  3. 每个SP对应一个或多个OpenCL计算单元。
  4. Adreno GPU可能包含一个或多个SP,具体取决于GPU系列和层。 低层芯片组可能具有单个SP,而高端或高级层芯片组可能具有更多SP。 在图3-1中,只有一个SP。
  5. SP通过L2缓存为使用__read_write限定符(OpenCL 2.0功能)定义的缓冲区对象和图像对象加载和存储数据。
  6. SP从纹理处理器/ L1模块加载用于只读图像对象的数据。
  • 纹理处理器(TP)
  1. 根据内核的请求执行纹理操作,例如纹理获取和过滤。
  2. TP与L1缓存耦合,后者在纹理数据缓存未命中的情况下从UCHE获取数据。
  • 统一二级缓存(UCHE)
  1. 响应SP对缓冲区对象的加载/存储请求以及L1缓存对图像对象的数据加载请求。

3.2.2 Waves和fibers

在Adreno GPU中,执行的最小单位称为fibers。 一个fibers对应于OpenCL中的一个工作项。 总是以锁步执行的一组fibers称为波。 SP一次可以容纳多个活动波。 每个Waves通常都可以独立前进,而与其他Waves的状态无关。 注意:

  • 对于给定的GPU和内核,波形大小或波形中的fibers数量通常是固定的。
  • Adreno GPU中的波形大小取决于GPU系列和层以及编译器; 值可以是8、16、32、64、128等。
  • 一个工作组可以由一个或多个wave执行,具体取决于工作组的大小。 例如,如果工作组大小小于或等于波形大小,则一个波形就足够了。 通常,更多的wave会更好,因为它们可以更好地隐藏延迟。
  • SP可以同时对一个或多个波形执行ALU指令。
  • 在工作组中可以通过管道传递的最大波数取决于硬件。 通常,Adreno GPU支持多达16个波形。
  • 在给定内核的情况下,一个SP中最大活动波数取决于内核的寄存器占用空间和寄存器文件大小,而后者又取决于GPU系列和层。
  • 通常,内核越复杂,活动波就越少。
  • 给定内核,最大工作组大小是最大允许波数与波大小的乘积。

OpenCL 1.x并未展示wave的概念,而OpenCL 2.0允许应用程序通过cl_khr_subgroups扩展来使用它,Adreno A5x GPU支持该扩展。

3.2.3 延迟隐藏

延迟隐藏是GPU进行高效并行处理的最强大功能之一,它使GPU能够实现高吞吐量。 这是一个例子:

  • SP开始执行第一波。
  • 经过几条ALU指令后,此通知需要来自外部存储器(可能是全局/本地/私有存储器)的其他数据才能继续进行,而这是不可用的。
  • SP为此波发送数据获取请求。
  • SP将执行切换到准备执行的第二波。
  • SP继续执行第二波,直到尚未准备好外部依赖项。
  • 如果第一波的数据可用,SP可以切换到第三波,或切换回第一波。

这样,SP几乎很忙,并且像“全职”一样工作,因为可以很好地隐藏延迟或依赖性。

3.2.4 工作组分配

典型的OpenCL内核会启动多个工作组。 在Adreno GPU中,每个工作组都分配给一个SP,并且每个SP通常一次处理一个工作组。 剩余的工作组(如果有)在GPU中排队执行。

以图3-2中的2DRange为例,并假定这是具有4个SP的GPU。 图3-3显示了如何将工作组分配给不同的SP。 在此示例中,共有9个工作组,每个工作组由一个SP执行。 每个工作组有四个波,波的大小为16。
在这里插入图片描述在这里插入图片描述OpenCL标准既没有定义工作组启动/执行的顺序,也没有定义工作组同步的方法。 对于Adreno GPU,开发人员无法假定工作组是按SP上的特定顺序启动的。 波浪也是如此。

在大多数Adreno GPU中,一个SP一次只能处理一个工作组,并且必须先完成工作组才能启动另一个工作组。 在诸如Adreno A540 GPU之类的较高版本或更高版本中,支持按SP执行多工作组执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值