前言

 应领导要求需要将最初级版本的算法移植到ARM板子上,并进行优化,以期达到实时。

平台

移植前: TX2

移植后: ARM()

processor    :
model name : ARMv7 Processor rev (v7l)
BogoMIPS : 7.54
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture:
CPU variant : 0x2
CPU part : 0xc09
CPU revision : Hardware : Freescale i.MX6 Quad/DualLite (Device Tree)
Revision :
Serial :

背景:最早版本在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-          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- 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- arm-linux-gnueabihf-python2.-config
arm-linux-gnueabihf-cpp- arm-linux-gnueabihf-gcov arm-linux-gnueabihf-python-config
arm-linux-gnueabihf-dwp arm-linux-gnueabihf-gcov- 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- arm-linux-gnueabihf-run
arm-linux-gnueabihf-g++- arm-linux-gnueabihf-gprof arm-linux-gnueabihf-size
arm-linux-gnueabihf-gcc arm-linux-gnueabihf-ld arm-linux-gnueabihf-strings
arm-linux-gnueabihf-gcc- 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编译优化知多少

【linux基础】关于ARM板子使用O3编译选项优化的更多相关文章

  1. Linux基础命令和NAT技术

    yum    yellowdog updater,modified是一种用python写的基于rpm的管理工具 用于解决rpm包的依赖性 要安装编译工具 yum install gcc 库函数:静态库 ...

  2. BeagleBone Black教程之BeagleBone Black使用到的Linux基础

    BeagleBone Black教程之BeagleBone Black使用到的Linux基础 BeagleBone Black涉及到的Linux基础 在许多没有Linux相关经验的人看来,Linux看 ...

  3. 将中文库导入到ARM板子中以解决中文显示乱码的教程

    1.将中文字符集导入到ARM板子中的/usr/fonts/目录下 在这里我们使用的字符集为:DroidSansFallback.ttf 下载地址为:https://pan.baidu.com/s/1e ...

  4. 嵌入式LINUX基础教程 第2版

    嵌入式LINUX基础教程  第2版 目录 第1章 入门 11.1 为什么选择Linux 11.2 嵌入式Linux现状 21.3 开源和GPL 21.4 标准及相关组织 31.4.1 Linux标准基 ...

  5. 【学习笔记】Linux基础(零):预备知识

    学习笔记(连载)之Linux系列 Note:本学习笔记源自<鸟哥的Linux私房菜(基础学习篇)>一书,为此书重要内容的摘要和总结,对于一些常识性的知识不再归纳 新型冠状病毒引发的肺炎战& ...

  6. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  7. 大数据每日干货第四天(linux基础之一目录结构与常用命令)

           为了和qq空间同步,也写的第四天,前面几天明天会发布,本来打算把每天学的东西记录下来,通过朋友给的建议要发的话稍微系统化下,从大数据需要的linux基础,到离线数据分析包括hadoop. ...

  8. Linux课程实践一:Linux基础实践(SSH)

    一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...

  9. 还是不想改报告,伊阿忆啊哟-Linux基础继续

    hi 虽然今天是最最美好的周六(前不着工作日后不着工作日),但老子还要来改报告,但额就是不想改,你拿我有啥办法啊... 争取完结Linux基础 一.Linux常用命令(三) 4.帮助命令 4.1 帮助 ...

随机推荐

  1. linux的必知必会规则

  2. 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉

    众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...

  3. 从GitHub远程仓库中删除文件夹或文件

    在上传项目到github时,忘记忽略了某个文件夹target,就直接push上去了, 最后意识到了此问题,决定删除掉远程仓库中的target文件夹 删除前: 删除后: 在github上只能删除仓库,却 ...

  4. Docker常用命令详解

    docker ps 查看当前正在运行的容器 docker ps -a 查看所有容器的状态 docker start/stop id/name 启动/停止某个容器 docker attach id 进入 ...

  5. python 过滤四字节字符 表情字符

    项目中有时需要过滤掉四字节以上的字符(表情),比如mysql数据库5.5.3以下的版本text字段不支持四字节以上字符 于是就需要过滤掉再入库,python中的方法为:   try:   # pyth ...

  6. linux基础09-bash编程(条件测试和特殊变量)

    (1)整数测试 INT1=63 INT2=77 [ $INT1 -eq $INI2 ] [[ $INT1 -eq $INT2 ]] test $INT1 -eq $INT2 文件测试: -e FILE ...

  7. VUE.js 简单引用

    Vue开发的两种方式:静态资源引入开发 和 脚手架交互式开发 这里使用的是静态资源引入开发 首先 引用jquery.js  和  vue.js html 标签内加个 <div id=" ...

  8. pycharm 执行unittest 没有生成测试报告

    解决: [第一步] [第二步]

  9. jQuery中防止表单提交两次的方法

    遇到过表单提交两次的情况,做个记录: 解决场景:首先是表单验证,其次是防止多次提交表单: jQuery中插件:validate_submitHandler_plugin,具体的可以使用关键字搜索: 使 ...

  10. mqtt------ mosca服务器端参数简介

    一:服务器端 为什么使用mosca:mosca是基于node.js开发,上手难度相对较小,其次协议支持完整,除了不支持Qos 2,其它的基本都支持.持久化支持redis以及mongo.二次开发接口简单 ...