【linux基礎】關於ARM板子使用O3編譯選項優化


前言

 應領導要求需要將最初級版本的算法移植到ARM板子上,並進行優化,以期達到實時。

平台

移植前: TX2

移植后: ARM()

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環境配置

說實話,這次移植只是將平台換成了ARM,仍然是在ubuntu系統上運行,沒什么大的問題。安裝需要的庫,此處主要是opencv,缺少的添加上去即可,測試的時候遇到一個容易忽略的問題,就是明明有攝像頭,測試程序卻print沒有獲取到攝像頭,還以為是硬件的問題,后來使用ARM自帶的程序測試可以獲取到攝像頭,原來默認獲取的攝像頭ID和算法程序中的不一致造成的,這個可以通過插拔攝像頭接口,查看硬件部分攝像頭連接的是哪個接口,具體使用的命令是:

$ls /dev/vi*

測試讀取存儲圖像耗時:

測試讀取攝像頭圖像耗時:

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和浮點運算。

參考

1. ARM平台NEON指令的編譯和優化;

2. 編譯選項-O1,-O2,-O3編譯優化知多少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM