• 【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编译优化知多少

  • 相关阅读:
    Android studio快捷键总结
    汇编寄存器(内存访问)基础知识之四----栈
    汇编寄存器(内存访问)基础知识之三---mov指令
    android studio学习之一
    ASCII值对照表
    chrome 优秀的插件推荐
    android基础知识之一
    汇编基础知识之二debug的使用
    计算机专业课系列之三:进程和线程
    计算机专业课系列之二:程序的机器表示(汇编)
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/10488373.html
Copyright © 2020-2023  润新知