代码Android端加速

一、背景介绍

目前在做一个计算机视觉方面的项目,PC端代码速度可以达标,但移植到android端效率大大降低,所以最近在想办法优化android端的算法。由于之前完全没有接触android,所以优化方法只能上网查找,结果是有用的资料非常少,总结下来推荐的方法有以下两种:OpenCLNEON指令集优化

二、方法操作

1.OpenCL优化(GPU)

OpenCL就是使用手机的GPU对代码进行优化,由于我们的项目中大量使用opencv,而opencv本身就有很多函数均可以使用opencl加速,并且都已经写好的。所以我们这边就想办法打开opencv中的opencl选项,进行加速。
具体的方法可以参考:http://www.cnblogs.com/hrlnw/p/4720977.html

上面网页方法亲测可用,下面我将自己优化过程中的一些经验分享出来,帮大家少掉坑。
编译带有opencl选项的opencv for android:
我是在linux平台下进行编译的,下面是一些tips
(1)修改文件:
A.
opencv3.0之前: ../opencv/modules/ocl/src/cl_runtime/cl_runtime.cpp
opencv3.0之后: ../opencv/CMakeLists/modules/core/src/opencl/runtime/opencl_core.cpp。
B.
../opencv/CMakeLists.txt,修改OCV_OPTION(WITH_OPENCL ON))即可。
tips:
(2).一般编译过程中设置路径,不要包含空格、中文等字符,否则会出现很奇怪的错误。
(3).修改opencv中的文件,不要将修改后的文件与源文件放在一起,否则会报错(我就为了备份,将需要修改的cmake文件
复制了一份,并放在同一文件夹内,报错)
(4).不需要修改/opencv/cmake/opencvdetectopencl.cmake文件,因为我们这边是为android端build带有opencl的opencv,
其中opencl的库在手机端(libOpencl.so或libGLES.so)本地存在,所以只要保证该文件中的opencl头文件路径包含就可以了
(opencv一般会自己指定)。因此,不用像网上有的教程修改该文件,浪费时间。

编译成功后,在android端优化却不是非常明显,这个问题我们还在找。

2.NEON指令集优化(并行)

NEON指令集加速,是目前android端推荐最多的方式,基本的介绍可以百度,有很多文章。
这个优化有两种:
(1)直接使用NEON指令集封装好的C指令,网上有很多介绍,操作方法也是类C风格,比较容易上手。
(2)对寄存器写汇编进行优化。
第一种方法上手快,效果也比较明显;第二种写起来会比较费劲,但加速效果会非常恐怖(前提是要对汇编指令足够熟悉)。 而这两种方法对于使用opencv的函数却没法优化。。。。

后续,该文章还会更新,也希望各位朋友一起切磋交流。
android端优化很难啊。

你可能感兴趣的:(工作)