dlib 在linux下的编译,DLIB在嵌入式上编译总结

前言

在海思3536上移植DLIB库,用arm-hisiv300-linux-g++编译器。

DLIB编译

在DLIB下建Build目录,进入。编译脚本如下:

cmake .. -DCMAKE_CXX_COMPILER:FILEPATH=arm-hisiv300-linux-g++ -DCMAKE_C_COMPILER:FILEPATH=arm-hisiv300-linux-gcc -DCMAKE_BUILD_TYPE:STRING=RELEASE -DHISIV300=1 -DDLIB_USE_BLAS=1 -DDLIB_USE_LAPACK=1

-DDLIB_USE_BLAS=1:寻找OPENBLAS,详细后面说明。

-DHISIV300=1:因为我在同一份代码里面除了交叉编译以外,还用VS2015编译WINDOWS版本,便于调试。HISIV300用来区分是否嵌入式交叉编译,在根CMakeLists.txt里的脚本如下:

cmake_minimum_required(VERSION 2.8.12)

if (HISIV300)

message("configure hisiv300")

#add_compile_options(-mcpu=cortex-a7 -mfloat-abi=softfp -mno-unaligned-access -fno-aggressive-loop-optimizations)

add_compile_options(-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations)

#add_compile_options(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations)

add_compile_options(-D_GLIBCXX_USE_C99)

endif()

add_subdirectory(dlib)

也尝试各种浮点编译选项,最后用的这是性能最好的。

因为DLIB编译需要C++11,HISIV300编译器对C++11支持还不是很好,要修改如下:

加-D_GLIBCXX_USE_C99这个宏解决std::to_string等函数找不到的问题。

添加如下声明:

#ifndef _WIN32

#define DLIB_USE_BLAS

namespace std

{

double round(double f);

float erfc(float f);

}

#endif

这两个接口声明找不到,也试了TR1宏,没搞定,就直接声明了。

exception_ptr很多接口链接时找不到,只能自己实现

#ifdef LINUX

#include

namespace std

{

namespace __exception_ptr

{

exception_ptr::exception_ptr()

:_M_exception_object(0)

{}

exception_ptr::~exception_ptr()

{}

exception_ptr::exception_ptr(const exception_ptr& e)

:_M_exception_object(e._M_exception_object)

{}

exception_ptr& exception_ptr::operator=(const exception_ptr& e)

{

_M_exception_object = e._M_exception_object;

return *this;

}

void exception_ptr::swap(exception_ptr& e)

{

void* tmp = _M_exception_object;

_M_exception_object = e._M_exception_object;

e._M_exception_object = tmp;

}

}

//__thread exception_ptr g_cur_e;

exception_ptr current_exception()

{

return exception_ptr();

}

void rethrow_exception(exception_ptr e)

{

throw std::exception();

}

}

#endif

openblas编译

-DDLIB_USE_BLAS=1查找OPENBLAS库,用来优化矩阵运行。下面开始编译OPENBLAS库。

make TARGET=ARMV7 ARM_SOFTFP_ABI=1 HOSTCC=gcc CC=arm-hisiv300-linux-gcc NOFORTRAN=1

打开OPENMP开关作用不是很大,OPENBLAS默认2个线程工作。如果改成4个性能会变的很差,不确定原因。

将编译后的.a,改成libopenblas.a。修改DLIB查找openblas库的路径。

在dlib/cmake_utils/cmake_find_blas.txt,做如下修改:

set(extra_paths

/usr/lib64

/usr/lib64/atlas-sse3

/usr/lib64/atlas-sse2

/usr/lib64/atlas

/usr/lib

/usr/lib/atlas-sse3

/usr/lib/atlas-sse2

/usr/lib/atlas

/usr/lib/openblas-base

/opt/OpenBLAS/lib

~/code/dlib

$ENV{OPENBLAS_HOME}/lib

)

tcmalloc编译

用来优化内存分配。

下载gperftools代码,先运行./autogen.sh,可能需要安装autoreconf、libtool连个工具。

然后:

./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-linux CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations" CXXFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations" --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal

生成后的.a为libtcmalloc_minimal.a,可以改成libtcmalloc.a。

生成可执行文件时,在所有链接的.a的最后面加入“-ltcmalloc”。

总结

这一波优化,在3536上,450*600分辨率的图片,特征提取用时170ms/张,而人脸检测用时300ms/张。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值