这章将简要讨论一些开发Adreno OpenCL应用程序的基本要求,下面将会介绍如何调试和统计程序性能. 4.1  安卓平台上开发OpenCL程序 目前,Adreno GPU主要是在安卓操作系统和在部分Linux系统上支持OpenCL.为了开发带OpenCL的安卓app,开发者必须熟悉android软件开发套件(SDK)和本地开发套件(NDK 用来运行C/C++的).更多关于Android SDK和NDK的信息,可分别参考https://developer.android.com/index.h…
2  Opencl的简介 这一章主要讨论Opencl标准中的关键概念和在手机平台上开发Opencl程序的基础知识.如果想知道关于Opencl更详细的知识,请查阅参考文献中的<The OpenCL Specification>.对于已经有OpenCL的基础知识和经验的开发者可以跳过这一章,直接跳到下一章阅读即可. 2.1 OpenCL背景和概述 Opencl是由Khronos group开发和维护的一个开源的和完全免费的标准,针对是如何在异构系统上进行跨平台的程序并行.OpenCL设计理念是帮助…
1 前言 1.1 目的 这篇文档的主要目的是,向原始设备制造商(OEMs),独立软件供应商(ISVs),第三方开发者们,提供在基于高通骁龙400系列.600系列,和800系列的手机平台和芯片上进行开发和优化Opencl应用程序的一些准则. 1.2 惯例 函数声明,函数名字,类型声明,属性,和代码示例会用不同的字体格式出现,比如#include 变量会用尖括号表示,比如 < number> 命令会用不同的格式出现,比如 copy a:*.* b:. 按钮和键盘名字会用粗体表示,比如点击Save…
内存优化是最重要也是最有效的OpenCL性能优化技术.大量的应用程序是内存限制而不是计算限制.所以,掌握内存优化的方法是OpenCL优化的基础.在这章中,将会回顾OpenCL的内存模型,然后是最优的实践方法. 7.1 在Adreno GPU中的OpenCL内存模型 OpenCL定义了四种内存类型——也就是,global(全局的),local(本地的),constant(常量的),和private(私有的)内存,理解这些内存的不同点是基本要求.图7-1展示了四种内存概念上的设计图. 图7-1 Op…
对于许多kernels来说,工作组大小的调整会是一种简单有效的方法.这章将会介绍基于工作组大小的基础知识,比如如何获取工作组大小,为什么工作组大小非常重要,同时也会讨论关于最优工作组大小的选择和调整的一般方法. 6.1 获取最大的工作组尺寸 在运行完clBuildProgram后,使用下面的API函数可以查询设备的最大工作组尺寸. size_t maxWorkGroupSize; clGetKernelWorkGroupInfo(myKernel, myDevice, CL_KERNEL_WOR…
这章提供了一个OpenCL应用程序优化的总体概述.更多的细节将会在接下来的章节中找到. 注意:OpenCL程序的优化是具有挑战性的.相比初始的程序开发工作,经常需要做更多的工作. 5.1 性能移植性 就像在2.4.2节中讨论的那样,在不同的架构之间,OpenCL一般都没有很好的性能移植性.针对某一个平台,特别是针对某个GPU优化的OpenCL应用程序,移植到Adreno GPU上后可能没有相同的性能.编程指南和其他OpenCL厂商的最佳做法,可能对Adreno GPU完全不适用.因此,针对在Ad…
3 在骁龙上使用OpenCL 在今天安卓操作系统和IOT(Internet of Things)市场上,骁龙是性能最强的也是最被广泛使用的芯片.骁龙的手机平台将最好的组件组合在一起放到了单个芯片上,这样保证了基于骁龙平台的设备将带来极致的功耗效率和集成的解决方案,从而带来最新的手机用户体验. 骁龙是一个多处理器系统,包含比如多模解调器(multimode modem),CPU,GPU,DSP,位置/GPS,多媒体,电源管理,RF,针对软件和操作系统的优化,内存,可连接性(Wi-Fi,蓝牙)等.…
在这一章中,将会用一些例子来展示如何使用之前章节中讨论的技术来进行优化.除了一些小的简单代码片段的展示外,还有两个熟知的图像滤波处理,Epsilon滤波和Sobel滤波,将会使用之前章节中讨论的方法进行一步一步地优化. 9.1 应用程序的代码样本 9.1.1 提升算法 这个例子说明了如何简化代码来提升性能.给定一张图片,对它进行8x8的box模糊滤波. 优化前的原始kernel代码: __kernel void ImageBoxFilter(__read_only image2d_t sourc…
这章将会说明一些kernel优化的小技巧. 8.1 kernel合并或者拆分 一个复杂的应用程序可能包含很多步骤.对于OpenCL的移植性和优化,可能会问需要开发有多少个kernel.这个问题很难回答,因为这涉及到很多的因素.下面是一些准则: 内存和计算之间的平衡. 足够多的wave来隐藏延迟. 没有寄存器溢出. 上面的要求可以通过执行以下操作实现: 如果这样做能够带来更好的数据并行,将一个大的kernel拆分成多个小的kernel. 如果内存的流量能够减少而且同样能保证并行性,可以将多个ker…
这篇文档主要是介绍了关于在Adreno GPUs上优化OpenCL代码的详细方法.文档中提供的大量信息能够帮助开发者理解OpenCL基础和Adreno结构,还有最重要的,掌握OpenCL优化技能. OpenCL优化经常是具有挑战性的而且需要大量的尝试和试错.因为每个供应商对同一个任务可能都有他自己的最好的实践方法,所以通读这个文档,并对Adreno GPUs的优化准则和方法有深入的了解都是很重要的.许多看起来次要的因素可能对性能有很大的影响.不幸地是,不亲自动手操作和实践会很难解决这些问题(比如…