代碼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端優化很難啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章