前言python
應領導要求須要將最初級版本的算法移植到ARM板子上,並進行優化,以期達到實時。linux
平臺c++
移植前: TX2算法
移植後: ARM()ubuntu
processor : 3 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 7.54 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 10 Hardware : Freescale i.MX6 Quad/DualLite (Device Tree) Revision : 0000 Serial : 0000000000000000
背景:最先版本在TX2上運行時間大約有60ms左右。測試
具體操做優化
1.ARM環境配置ui
說實話,此次移植只是將平臺換成了ARM,仍然是在ubuntu系統上運行,沒什麼大的問題。安裝須要的庫,此處主要是opencv,缺乏的添加上去便可,測試的時候遇到一個容易忽略的問題,就是明明有攝像頭,測試程序卻print沒有獲取到攝像頭,還覺得是硬件的問題,後來使用ARM自帶的程序測試能夠獲取到攝像頭,原來默認獲取的攝像頭ID和算法程序中的不一致形成的,這個能夠經過插拔攝像頭接口,查看硬件部分攝像頭鏈接的是哪一個接口,具體使用的命令是:spa
$ls /dev/vi*
測試讀取存儲圖像耗時:.net
測試讀取攝像頭圖像耗時:
2. ARM優化
最先是按照neon和浮點加速運算的方向來優化的,只是須要添加一些編譯選項便可。
$lscpu
檢測neon單元是否存在;
$cat /proc/cpuinfo Features : swp half thumb fastmult vfp edsp thumbee vfpv3vfpv3d16
檢測處理器是否支持neon
$cat /proc/cpuinfo | grep neon
檢測系統配置文件確認內核是否使能neon
$zcat /proc/config.gz | grep neon 看是否存在 CONFIG_NEON=y
編譯選項
arm-linux-gnueabihf-g++ -O3 -march=armv7-a -mcpu=cortex-a9 -ftree-vectorize -mfpu=neon -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math
發現並無多大的效果。
測試循環的浮點運算的加速;
發現是否使用-O3這個編譯選項的耗時差異比較大。
問題:
g++: error: arm-linux-gnueabihf-gcc: No such file or directory
查看是否有該編譯器(使用TAB鍵補全)
$ arm-linux-gnueabihf-
輸出
arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc-ar-5 arm-linux-gnueabihf-nm arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-nm-5 arm-linux-gnueabihf-objdump arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-pkg-config arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcc-ranlib-5 arm-linux-gnueabihf-python2.7-config arm-linux-gnueabihf-cpp-5 arm-linux-gnueabihf-gcov arm-linux-gnueabihf-python-config arm-linux-gnueabihf-dwp arm-linux-gnueabihf-gcov-5 arm-linux-gnueabihf-ranlib arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gcov-tool arm-linux-gnueabihf-readelf arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gcov-tool-5 arm-linux-gnueabihf-run arm-linux-gnueabihf-g++-5 arm-linux-gnueabihf-gprof arm-linux-gnueabihf-size arm-linux-gnueabihf-gcc arm-linux-gnueabihf-ld arm-linux-gnueabihf-strings arm-linux-gnueabihf-gcc-5 arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-strip arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld.gold
發現有該編譯器,可是仍是顯示沒有,不知道爲何,不過改成arm-linux-gnueabihf-g++就能夠編譯經過。
結論
以目前的結果看來,編譯選項-O3已經完成了較高級別的加速,其中應該包括neon和浮點運算。
參考
完