HI3516D之Caffe移植

编译Glog

cd glog-0.3.5
./configure --host=arm-linux --prefix=/usr/local/HI3516D/v400/glog-0.3.5 CFLAGS="-ffunction-sections -fdata-sections -O2" CXXFLAGS="-ffunction-sections -fdata-sections -O2"
make -j8
make install

编译gflags

使用cmake-gui进行配置

#

编译Opencv

修改CMakeLists.txt

# 强制打开NEON开关
# OCV_OPTION(ENABLE_NEON              "Enable NEON instructions"                                 "${NEON}" IF CMAKE_COMPILER_IS_GNUCXX AND (ARM OR AARCH64 OR IOS) )
OCV_OPTION(ENABLE_NEON                "Enable NEON instructions"                                 ON )

修改OpenCVCompilerOptions.cmake

# 将ENABLE_NEON开启之后的gcc参数修改为海思3516D推荐的参数"-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp"
if(ENABLE_NEON)
    add_extra_compiler_option("-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp")

使用cmake-gui进行配置

HI3516D之Caffe移植_第1张图片

选择Specify options for cross-compiling,进入交叉编译链设置界面

HI3516D之Caffe移植_第2张图片

# 设置交叉编译相关参数
# 本文使用的是海思3516D SDK 提供的 V400 工具链,存放位置为/opt/arm-hisiv400-linux/(更改为你正在使用的目录)
# 设置Operating System 为 arm-linux 
# 设置C编译器为 /opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-gcc
# 设置C++编译器为 /opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-g++
# 设置System Root 为 /opt/arm-hisiv400-linux/target

点击Configure生成配置选项,并且打开Advancd选项

HI3516D之Caffe移植_第3张图片

修改设置选项:

# 去掉勾选为FLASE 勾选为TRUE
BUILD_SHARED_LIBS                 # FLASE为编译静态库 TRUE为编译动态库
CMAKE_BUILD_TYPE                  # Release
CMAKE_CXX_FLAGS                   # -fPIC
CMAKE_C_FLAGS                     # -fPIC
CMAKE_EXE_LINKER_FLAGS            # -lrt -lpthread    
CMAKE_INSTALL_PREFIX              # 自定义安装目录
WITH_CUDA                         # FLASE 禁用CUDA
WITH_CUFFT                        # FLASE 禁用CUFFT
WITH_FFMPEG                       # FLASE 禁用FFMPEG
WITH_OPENCL                       # FLASE 禁用OPENCL
WITH_OPENCLAMDBLAS                # FLASE 禁用OPENCLAMDBLAS
WITH_OPENCLAMDFFT                 # FLASE 禁用OPENCLAMDFFT
WITH_OPENCL_SVM                   # FLASE 禁用OPENCL_SVM

点击Generate生成Makefile

进入_install目录&编译

cd _install
make -j8 
make install

编译Protobuf

生成PC版本protoc可执行文件,供编译ARM版本库时使用

# 修改/etc/bash.bashrc 设置为CC/CXX/LD为普通gcc编译器
cd protobuf-3.2.0
./autoconf.sh
./configure --prefix=/usr/local/PC/protobuf-3.2.0

编译ARM版本

# 修改/etc/bash.bashrc 设置为CC/CXX/LD为交叉编译器
cd protobuf-3.2.0
./autoconf.sh
./configure --build=i686-pc-linux --host=arm-linux --with-protoc=/usr/local/PC/protobuf-3.2.0/bin/protoc --prefix=/usr/local/HI3516D/v400/protobuf-3.2.0

编译OpenBLAS

修改Makefile.arm

# 根据你的ARM处理器版本和操作系统修改对应的CCOMMON_OPT和FCOMMON_OPT
# 本文档针对的是HI3516D,属于armv7架构
ifeq ($(CORE), $(filter $(CORE),ARMV7 CORTEXA9 CORTEXA15))
ifeq ($(OSNAME), Android)
CCOMMON_OPT += -mfpu=neon  -march=armv7-a
FCOMMON_OPT += -mfpu=neon  -march=armv7-a
else
# CCOMMON_OPT += -mfpu=neon  -march=armv7-a
# FCOMMON_OPT += -mfpu=neon  -march=armv7-a
CCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp 
FCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
endif

编译

cd OpenBLAS-0.2.20
# 编译单独的静态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs -j8
# 编译动态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs shared -j8

安装

# PREFIX使用您自己的自定义安装目录
make PREFIX=/usr/local/HI3516D/v400/openBLAS-0.2.20 install

编译HDF5

因为在交叉编译HDF5的过程中需要实时运行H5detect和H5make_libsettings这两个可执行文件来生成H5Tinit.c和H5lib_settings.c,但是因为交叉编译生成的H5detect和H5make_libsettings只能在Arm上面运行

将首次交叉编译生成的H5detect和H5make_libsettings拷贝到Arm目标系统上执行,执行成功后可以生成H5Tinit.c和H5lib_settings.c,将这两个Arm上面生成的文件替换到交叉编译的源码中

因为这里采用了手动拷贝执行文件到Arm目标上执行的方法,所以再次交叉编译的时候屏蔽掉相关生成步骤

修改configure文件

# 屏蔽掉所有和交叉编译验证相关的步骤
# 搜索cannot run test program while cross compiling获得具体校验代码位置(共四处)
if test "$cross_compiling" = yes; then :
# { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
# $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
# as_fn_error $? "cannot run test program while cross compiling
# See \`config.log' for more details" "$LINENO" 5; }
else

# 执行配置
./configure --host=arm-linux --prefix=/usr/local/HI3516D/v400/hdf5-1.8.20 CFLAGS="-ffunction-sections -fdata-sections -O2" CXXFLAGS="-ffunction-sections -fdata-sections -O2"

修改Makefile

# 屏蔽掉和H5Tinit.c、H5lib_settings.c生成相关的Makefile代码
H5Tinit.c: H5detect$(EXEEXT)
# LD_LIBRARY_PATH="$$LD_LIBRARY_PATH`echo $(LDFLAGS) |              \
      sed -e 's/-L/:/g' -e 's/ //g'`"                               \
  $(RUNSERIAL) ./H5detect$(EXEEXT) > $@  ||                         \
      (test $$HDF5_Make_Ignore && echo "*** Error ignored") ||      \
      ($(RM) $@ ; exit 1)

H5lib_settings.c: H5make_libsettings$(EXEEXT) libhdf5.settings
# LD_LIBRARY_PATH="$$LD_LIBRARY_PATH`echo $(LDFLAGS) |              \
      sed -e 's/-L/:/g' -e 's/ //g'`"                               \
  $(RUNSERIAL) ./H5make_libsettings$(EXEEXT) > $@  ||               \
      (test $$HDF5_Make_Ignore && echo "*** Error ignored") ||      \
      ($(RM) $@ ; exit 1)

编译&安装

make 
make install

编译Boost

生成编译脚本

cd boost_1_59_0
./bootstrap.sh --prefix=/usr/local/HI3516D/v400/boost-1.59.0

修改编译脚本project-config.jam

if ! gcc in [ feature.values <toolset> ]
{
    using gcc : arm : arm-hisiv400-linux-gnueabi-gcc ; # 注意中间的多处空格
}

编译&生成

./bjam install toolset=gcc-arm --layout=togged --build-type=complete --prefix=/usr/local/HI3516D/v400/boost-1.59.0

编译OpenBLAS

修改Makefile.arm

# 根据你的ARM处理器版本和操作系统修改对应的CCOMMON_OPT和FCOMMON_OPT
# 本文档针对的是HI3516D,属于armv7架构
ifeq ($(CORE), $(filter $(CORE),ARMV7 CORTEXA9 CORTEXA15))
ifeq ($(OSNAME), Android)
CCOMMON_OPT += -mfpu=neon  -march=armv7-a
FCOMMON_OPT += -mfpu=neon  -march=armv7-a
else
# CCOMMON_OPT += -mfpu=neon  -march=armv7-a
# FCOMMON_OPT += -mfpu=neon  -march=armv7-a
CCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp 
FCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
endif

编译

cd OpenBLAS-0.2.20
# 编译单独的静态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs -j8
# 编译动态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs shared -j8

安装

// PREFIX使用您自己的自定义安装目录
make PREFIX=/usr/local/HI3516D/v400/openBLAS-0.2.20 install

编译Caffe

修改Makefile和Makefile.config

#

编译&生成

# 
make all 
# 
make all -j8
make install

你可能感兴趣的:(HI3516D)