其实去年就已经把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加速

    转载:http://blog.csdn.net/dj0379/article/details/39484061 其实去年就已经把Android上OpenCL的demo做出来了,但是由于种种原因一直没有 ...

  2. cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...

    在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  3. cocos2dx在Android studio运行 以及在 Android 平台上使用 JavaScript 直接调用 Java 方法

    cocos2dx在Android studio运行 以及在 Android 平台上使用 JavaScript 直接调用 Java 方法 cocos2dx在Android studio运行 使用Andr ...

  4. 【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

    在cocos2d-js 3.0beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用Java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  5. 奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题

    相机:Gemini 3D双目结构光深度相机 环境:Android7.1 软件:SDK中的java demo下的depthforopenni2 问题: 在Android样例depthforopenni2 ...

  6. Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题

    相机:Gemini 3D双目结构光深度相机 环境:Android7.1 软件:SDK中的java demo下的depthforopenni2 问题: 在Android样例depthforopenni2 ...

  7. MVP在Android平台上的应用

    2019独角兽企业重金招聘Python工程师标准>>> MVP在Android平台上的应用 原文链接 : Introduction to Model-View-Presenter o ...

  8. 在 Android* 平台上设置原生 OpenGL ES*

    Setting up Native OpenGL ES* on Android* Platforms final.docx BSD2.0.txt ParticleSystemNDK.zip READM ...

  9. Android平台上集成萤石SDK

    这篇文章,就Android平台上如何集成萤石SDK进行讲解. 前言: 萤石是海康威视集团旗下的一家做视频云的公司.我们接入萤石设备,实现实时预览.远程回放.抓图.切换画质等功能. 关于具体如何接入,包 ...

最新文章

  1. OSChina 技术周刊第十六期 —— 每周技术精粹
  2. 关键帧动画html例子,Bounce.js 是一个漂亮的CSS3关键帧动画生成工具和类库_前端开发者...
  3. 如何更改OST、OAB文件的默认路径?
  4. 各种排序笔记---基于比较排序部分
  5. 走线和交互式布线_画PCB时,一些非常好的布线技巧
  6. 微信小程序 - 基本学习资源
  7. Linux MySQL单实例源码编译安装5.6
  8. elasticsearch docker无法挂载_Docker 容器监控方案怎么选?看看这套开源方案
  9. python从入门到精通需要多久-Python从入门到精通:一个月就够了
  10. HardSoft-Viewer SQL
  11. SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
  12. 「企业架构」TOGAF的权威指南
  13. java初级程序员需要掌握哪些,附源代码
  14. tumblr_使用Tumblr创建美丽且易于更新的博客
  15. 如何修改计算机无线mac地址,如何修改无线网卡物理地址,求指教
  16. Win10文件名排序
  17. 带你一步步破解亚马逊 淘宝 京东的反爬虫机制!
  18. <<视觉问答>>2022:SwapMix: Diagnosing and Regularizingthe Over-Reliance on Visual Context in VQA
  19. JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)
  20. ios app 解决微信扫二维码不能跳转问题

热门文章

  1. 这里没大路 华军软件网
  2. 用matplotlib获取雅虎股票数据并作图【转载】
  3. [Holo_wo]-计算机专业(物联网工程)应该如何学习?
  4. 论文写作排版小技巧(更新中)
  5. 商城+前后端分离+课程设计+大作业 Springboot+vue+swagger+好看的安卓界面
  6. 超越竞争文化:致善式创新能否打造手机产业的“海法城”
  7. 拓嘉辰丰电商:做好拼多多电商有哪些技巧
  8. proxmox tesla_大众One Ups Tesla突破性的电池突破
  9. Python 绘制热图
  10. Ubuntu系统使用输入法只能输入英文不能输入中文解决方法