分享

Android上使用OpenCL调用GPU加速|GPU世界论坛

 quasiceo 2016-07-26


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

下面是干货:
Android平台利用OpenCL框架实现并行开发初试

首先,我们需要完成开发环境的搭建。由于目标是安卓平台,我们需要安装JAVA SDK、Android SDK、Eclipse以及ADT插件,这些工具的安装教程很多,这里就不再赘述了,主要介绍Cygwin与NDK的环境搭建。
第一步,从http://developer./tools/sdk/ndk/index.html查看和下载NDK工具的相关资料和安装包,我们在开发时使用的是NDK r8版本,后续版本使用基本类似;可以参照NDK的文档进行深入的学习和测试。
第二步,从http://www. 下载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./cdt/downloads.php下载CDT的离线安装包,然后再Eclipse中点击Help->Install New Software,点击Archive确定安装包所在位置,然后进行安装;Sequoyah可以直接在线安装,Location为:http://download./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-android-sdk的samples目录下,同时在 Eclipse的项目属性Android选项中将"…\OpenCV-2.4.8-android-sdk\sdk\java"工程加入Android工 程中,如图所示:
在完成运行环境的配置后,在Cygwin中完成该项目的编译和库文件生成工作,如下图所示:

可在项目工程目录下的libs/armeabi-v7a下查看生成的.so文件(libSobelFilter.so):

至此,Sobel滤波程序已经编译完成。下面介绍一些运行结果。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多