转载:http://blog.csdn.net/dj0379/article/details/39484061
其实去年就已经把Android上OpenCL的demo做出来了,但是由于种种原因一直没有开源–
嗯现在就不吝啬了~奉献给大家~
后面在Android上还实现了很多种并行化的算法,比如SHA-1、HDR、K-means、NL-means、SRAD等等,会在近期整理好之后开源的。
原文发表在了异构开发技术社区
整理成教程是队友做的,十分感谢~
原博文地址
队友的博客
项目github地址
代码CSDN地址
下面是干货:

Android平台利用OpenCL框架实现并行开发初试

在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心、高并行化的GPU成为我们日常娱乐和科学研究必不可少的“利器”。同样,在近些年兴起的移动平台,诸如智能手机、平板电脑等,也日渐重视GPU在其应用中的作用。近几年,随着并行化的发展,越来越多的手持设备硬件厂商重视对并行化标准的支持和应用。这里,需要支持OpenCL这一开发运算标准,该标准以异构平台为目标,与CUDA、Direct Compute主要面向PC平台不同,因而得到了众多厂商的支持,如下表:

常见智能手机的硬件信息 款式CPU型号GPU型号OpenCL支持
三星GalaxyS5高通骁龙801(4核)Adreno330是
Iphone5S苹果A7(2核)Imagination PowerVR G6430是
小米3联通版高通骁龙800(4核)Adreno330是
魅族M3三星5410(8核)Imagination SGX544是

(主要是高通的产品)
而在国外的一些研究机构和学者也对智能手机、平板电脑这样的移动平台进行了并行化的研究,比如三星手机研究院和诺基亚研究院近几年就发表了很多关于这方面的资料;美国莱斯大学的学者Guohui Wang等人就对物品移除算法和SIFT算法进行了智能手机上的并行化实现。
并行计算已经在移动平台具备硬件条件和变成标准的支持,而并行化又可以带来提升设备硬件利用效率,同时GPU的低主频特性又可以在一定程度上降低功耗,因此在智能手机等移动平台实现并行计算具有巨大的潜在价值,特别在当前手机续航时间不能满足用户要求的背景下,并行化的特性显得尤为重要。
下面就具体就少一些实现流程和结果。
这次仅仅通过Sobel滤波这样的程序来完成基于OpenCL实现的Android平台并行化。
首先,我们需要完成开发环境的搭建。由于目标是安卓平台,我们需要安装JAVA SDK、Android SDK、Eclipse以及ADT插件,这些工具的安装教程很多,这里就不再赘述了,主要介绍Cygwin与NDK的环境搭建。
第一步,从http://developer.android.com/tools/sdk/ndk/index.html查看和下载NDK工具的相关资料和安装包,我们在开发时使用的是NDK r8版本,后续版本使用基本类似;可以参照NDK的文档进行深入的学习和测试。
第二步,从http://www.cygwin.com 下载Cygwin工具。由于NDK完成的工作是允许开发人员使用本地代码(如C/C++)进行Android APP功能开发,而在开发的过程中大多涉及到GCC环境下的编译、运行,我们采用了Cygwin模拟Linux编译环境。我安装的时候为了方便就把所有的文件都安装了,体积不大,1G左右。
安装完成后,运行”Cygwin.bat”,可以通过以下几个方法检验安装是否成功。(这里参照了以前的一些资料)
(1)cygcheck –c cygwin(正常显示如图)
 
(2)make –v,返回make命令的版本信息
 
3)gcc -v,返回gcc命令的版本信息
 
第三步,配置NDK的系统环境变量,为了避免编译时警告,可采用Linux风格的路径,如我的NDK安装路径为:“D:\android-ndk-r8-windows \android-ndk-r8”,在系统变量中名为“ndk”的变量路径为:“/cygdrive/ android-ndk-r8-windows/ android-ndk-r8”
另外,在Eclipse环境中可以安装CDT和Sequoyah插件方便Android工程对Native的开发(可以省略每次修改代码后都需要手动到代码目录进行ndk-build的步骤),可从http://www.eclipse.org/cdt/downloads.php下载CDT的离线安装包,然后再Eclipse中点击Help->Install New Software,点击Archive确定安装包所在位置,然后进行安装;Sequoyah可以直接在线安装,Location为:http://download.eclipse.org/sequoyah/updates/2.0/
如图:
 
(安装时不要勾选“Group items by category”选项,否则会出现列表为空的情况)。然后在Window->preferences->Android->本机开发选项中添加NDK的安装路径。
其次,我会简要的介绍OpenCL在Android开发过程中的一些设置和代码。在Android平台实现并行化的过程中,我主要遵循下面的框图进行:
 
主要思路就是利用JAVA中的JNI接口,结合Cygwin环境和NDK工具,将OpenCL实现的并行算法编译为可以被Android工程调用的libSobelFilter.so(lib***.so均可),然后在程序中调用该文件中的算法实现并行。
在Eclipse工程中jni文件夹下需要创建如下两个文件:Android.mk以及Application.mk,相当于该程序对应的makefile文件,前者定义了一系列规则来制定编译文件的目标和文件编译的顺序,后者定义了程序平台版本和编译器版本等内容。具体实现为,Android.mk文件:
 
Application.mk文件:
 
然后将OpenCL头文件拷贝到jni文件夹下,供工程编译时调用:
 
接下来需要我们按照OpenCL的框架流程进行并行化的初始化和内核入队操作,主要包括:
1)获得平台clGetPlatformIDs;2)创建上下文clCreateContexFromType;3)通过上下文得到设备信息clGetContextInfo;4)为相应设备创建commandQueue;5)创建源程序,生成kernel;6)分配buffer空间,设置程序参数;7)执行kernel,clEnqueueNDRangeKernel;8)从buffer读回数据clEnqueueReadBuffer。
这里几个操作时OpenCL的固定流程,具体代码很多,请大家参看下我的源码,这里就不写了。
这里我要指出的是由于移动平台的特殊性,我们在程序中对几个宏变量进行了定义:
 
上述几个Android平台需要的文件在不同版本的安卓系统中有不同的位置,上例
为Android 4.3版本的文件位置,在之前版本中文件多数位于”/system/lib/”文件夹下。
程序的核函数如下:
 
此外,该程序使用了OpenCV的相关函数完成图像操作,因此需要在对应的安卓手机上安装OpenCV-Manager来完成对OpenCV函数的调用工作(可从http://opencv.org/下载相关资料和安装包)。同时,为了程序编译的方便,建议将程序文件放置到OpenCV-android-sdk的samples目录下,同时在Eclipse的项目属性Android选项中将"…\OpenCV-2.4.8-android-sdk\sdk\java"工程加入Android工程中,如图所示:
在完成运行环境的配置后,在Cygwin中完成该项目的编译和库文件生成工作,如下图所示:

可在项目工程目录下的libs/armeabi-v7a下查看生成的.so文件(libSobelFilter.so):
 
至此,Sobel滤波程序已经编译完成。下面介绍一些运行结果。
我们在DragonBoard开发板上进行程序测试。我们采用的常见的lena图像,改变图像的大小进行对比,这里我们采用了256*256,512*512,1024*1024等大小不同的图片进行测试,检验并行程序与串行的加速比。DragonBoard采用骁龙800处理器,同时,该开发板提供了丰富的板上资源,包括Snapdragon 800 Processor(4核2.15GHz,GPU为Adreno 330)、BT4.0、HDMI output、Dual SATA等,产自INTRINSYC公司(详情请参见:http://shop.intrinsyc.com/ ,目前已经有Snapdragon 805平台的开发板)。
 
以下的图表分别展示了程序的运行界面和加速比对比。
 
表中是一些测量得到的结果:
图片大小 并行时间(ms) 串行时间(ms) 加速比
256*256 4.95 7,67 1.55
512*512 27.62 44.27 1.58
1024*1024 88.86 138.66 1.57
2048*2048 154.41 241.65 1.56
4096*4096 247.65 468.28 1.71
5000*5000 693.92 1321.41 1.91
从上述结果可以看出,在上述实验平台上,随着图片大小的增大(数据处理更加复杂),并行化的加速比会更加明显。
在其他的智能手机,如小米2s(CPU:高通骁龙600,GPU:Adreno320)也做了类似的测试,也可以实现图片处理的加速。

在Android上使用OpenCL调用GPU加速相关推荐

  1. android 平台上使用opencl 调用gpu 进行加速

    其实去年就已经把Android上OpenCL的demo做出来了,但是由于种种原因一直没有开源– 嗯现在就不吝啬了~奉献给大家~ 后面在Android上还实现了很多种并行化的算法,比如SHA-1.HDR ...

  2. 编译GDAL支持OpenCL使用GPU加速

    ##前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分 ...

  3. GDAL使用OpenCL开启GPU加速

    GDAL可以借助OpenCL,对特定重采样方法(只记得最邻近不行,三次卷积可以,双线性忘了),使用GPU提升计算效率 需要 GDAL源码 OpenCL Visual Studio SQLite(可选) ...

  4. Python Numba实现GPU加速

    Python与GPU Python作为解释型语言,.py文件一般是没法直接用GPU加速的,关于Python与GPU的结合点,以及GPU.CPU.CUDA.多核.并行.机器码-等底层实现,参考: < ...

  5. MATLAB GPU加速

    以前使用matlab 的时候,很多人都用过里面的并行工具箱,用的最多的应该就是parfor.实际上,matlab里面已经有不少工具箱里面都有了支持GPU加速的函数.使用matlab+GPU加速的前提是 ...

  6. Caffe2-windows下caffe的gpu加速

    摘要:本篇日志承载上篇内容,在上篇基础上进行优化和添加.主要说明在正确cpu的caffe框架下如何添加gpu加速的过程. 正文: 上篇说明了如何安装cpu版本的caffe框架,其中我提到过,只有cpu ...

  7. Ubuntu18.04下安装深度学习框架Pytorch(GPU加速)

    前面我们已经在windows10环境下成功安装了CPU版本的Pytorch,推荐的是利用Anaconda安装. 经过接近一天的奋战,博主成功在linux系统安装GPU加速的pytorch,博主使用的发 ...

  8. RK3588实战:调用npu加速,yolov5识别图像、ffmpeg发送到rtmp服务器

    前言:最近在学习一些rk3588相关的东西,趁着这个项目,把学习的相关东西整合下,放到一个项目里面,巩固学习的知识. 项目名称:yolov5识别图像.ffmpeg发送到rtmp服务器 功能:1.ope ...

  9. gpu超算算法_英伟达推GPU加速Arm服务器参考设计!微软Azure启动GPU超算实例

    芯潮(ID:aichip001)文 | 韦世玮 芯潮11月20日消息,昨天,英伟达在2019国际超级计算大会(SC19)上推出用于构建GPU加速Arm服务器的参考设计,以及用于优化网络和存储数据处理的 ...

最新文章

  1. AI一分钟 | 万达网科裁员95%高达5000余人,被爆下一步将转型AI; 英伟达放话了:研究人员放心用,不更新驱动就没啥事儿
  2. “深度学习一点也不难!”
  3. 【Spark】Spark SQL, DataFrames and Datasets Guide(翻译文,持续更新)
  4. linux搭建--DISPLAY环境变量问题(一)
  5. Boost:boost::bimaps::set_of的测试程序
  6. Axure实现多用户注册验证
  7. ObjectiveC 深浅拷贝学习
  8. Java,JavaFX的流利设计风格文本字段和密码字段
  9. RFID技术与应用 复习用
  10. ArcCatalog添加数据库连接
  11. react中使用sass报错SassError: Expected newline.
  12. 彼得林奇投资策略精髓
  13. unity3d 本地化数据PlayerPrefs详解
  14. OPENCV函数介绍:normalize()
  15. Personal deposit calculator(个人存款计算器)C#实现
  16. 简历模板...自行下载
  17. TARS 斩获 2018 年最佳原创开源软件奖
  18. 两年数据对比柱形图_2018年、2019年的数据对比图!想学习这种对比图的做法!安排...
  19. ig信息增益 java_【Python 编程】实现文本分类中的信息增益算法
  20. 生产计划自动排程目标是什么?

热门文章

  1. mysql某个表的列除以2_mysql常见面试题(二)
  2. openstack(Queens版) 安装FWaaS
  3. 工程是.java文件_1.8 工程相关解析(各种文件,资源访问)
  4. 云服务器怎么拷贝和删除文件,怎样给云服务器拷贝文件
  5. 南京林业大学计算机专升本,2018江苏专转本学校之:南京林业大学
  6. 计算机上没有找到服务was,win10系统搭建网站提示计算机“.”上没有找到wAs服务的步骤介绍...
  7. 主机漏洞-SSL/TLS 受诫礼(BAR-MITZVAH)攻击漏洞(CVE-2015-2808)【原理扫描】-RC4密码套件
  8. 济南计算机中考分数,【更新版】2017济南各初中中考成绩汇总!
  9. php n维数组扁平化,js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解...
  10. PHP获取其他网站上的内容,php – 从外部网站获取DIV内容