网站seo优化外包顾问,网站解析怎么设置,天河做网站开发,南宁市营商环境建设局网站其实去年就已经把Android上OpenCL的demo做出来了#xff0c;但是由于种种原因一直没有开源– 嗯现在就不吝啬了~奉献给大家~ 后面在Android上还实现了很多种并行化的算法#xff0c;比如SHA-1、HDR、K-means、NL-means、SRAD等等#xff0c;会在近期整理好之后开源的。 原文…其实去年就已经把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高通骁龙8014核Adreno330是 Iphone5S苹果A72核Imagination PowerVR G6430是 小米3联通版高通骁龙8004核Adreno330是 魅族M3三星54108核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”可以通过以下几个方法检验安装是否成功。这里参照了以前的一些资料
1cygcheck –c cygwin正常显示如图 2make –v返回make命令的版本信息 3gcc -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.solib***.so均可然后在程序中调用该文件中的算法实现并行。
在Eclipse工程中jni文件夹下需要创建如下两个文件Android.mk以及Application.mk相当于该程序对应的makefile文件前者定义了一系列规则来制定编译文件的目标和文件编译的顺序后者定义了程序平台版本和编译器版本等内容。具体实现为Android.mk文件 Application.mk文件 然后将OpenCL头文件拷贝到jni文件夹下供工程编译时调用 接下来需要我们按照OpenCL的框架流程进行并行化的初始化和内核入队操作主要包括
1获得平台clGetPlatformIDs2创建上下文clCreateContexFromType3通过上下文得到设备信息clGetContextInfo4为相应设备创建commandQueue5创建源程序生成kernel6分配buffer空间设置程序参数7执行kernelclEnqueueNDRangeKernel8从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 Processor4核2.15GHzGPU为Adreno 330、BT4.0、HDMI output、Dual SATA等产自INTRINSYC公司(详情请参见http://shop.intrinsyc.com/ 目前已经有Snapdragon 805平台的开发板)。 以下的图表分别展示了程序的运行界面和加速比对比。 表中是一些测量得到的结果
图片大小并行时间ms串行时间ms加速比256*2564.957,671.55512*51227.6244.271.581024*102488.86138.661.572048*2048154.41241.651.564096*4096247.65468.281.715000*5000693.921321.411.91
从上述结果可以看出在上述实验平台上随着图片大小的增大数据处理更加复杂并行化的加速比会更加明显。
在其他的智能手机如小米2sCPU高通骁龙600GPUAdreno320也做了类似的测试也可以实现图片处理的加速。