zoukankan      html  css  js  c++  java
  • arm ncnn

    ncnn网址:https://github.com/Tencent/ncnn

    1、

    sudo apt-get update

    sudo apt-get upgrade

    2、

    命令:sudo apt-get install g++-4.8-arm-linux-gnueabihf

    sudo apt-get install gcc-4.8-arm-linux-gnueabihf

    测试:

    $arm-linux-gnueabihf-g++-4.8 --version

    arm-linux-gnueabihf-g++-4.8 (Ubuntu/Linaro 4.8.5-4ubuntu1) 4.8.5

    Copyright (C) 2015 Free Software Foundation, Inc.

    This is free software; see the source for copying conditions.  There is NO

    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    sudo ln -s /usr/bin/arm-linux-gnueabihf-g++-4.8 /usr/bin/arm-linux-gnueabihf-g++

    sudo ln -s /usr/bin/arm-linux-gnueabihf-gcc-4.8 /usr/bin/arm-linux-gnueabihf-gcc

    arm linux 64位交叉编译器

    网址:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/

    下载:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz

    vi ~/.bashrc

     export PATH=/home/Your Name/armlinux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin:$PATH

    source ~/.bashrc

    测试:

     aarch64-linux-gnu-g++ --version

    输出:

    aarch64-linux-gnu-g++ (Linaro GCC 6.3-2017.05) 6.3.1 20170404
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

      

    3、在ncnn目录下的CMakeLists.txt,在cmake_minimum_required(VERSION 2.8.10)下面添加

    set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
    set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
    add_definitions(-D__ARM_NEON)
    add_definitions("-mfpu=neon")

    4、 src文件夹下,修改该文件夹下的CMakeLists.txt文件。删除如下图所示代码:

    CMakeLists.txt为

    ##############################################
    
    configure_file(platform.h.in ${CMAKE_CURRENT_BINARY_DIR}/platform.h)
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    include_directories(${CMAKE_CURRENT_BINARY_DIR})
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/layer)
    
    set(ncnn_SRCS
        allocator.cpp
        blob.cpp
        cpu.cpp
        layer.cpp
        mat.cpp
        mat_pixel.cpp
        modelbin.cpp
        net.cpp
        opencv.cpp
        paramdict.cpp
        benchmark.cpp
    )
    
    macro(ncnn_add_layer class)
        string(TOLOWER ${class} name)
    
        # WITH_LAYER_xxx option
        if(${ARGC} EQUAL 2)
            option(WITH_LAYER_${name} "build with layer ${name}" ${ARGV1})
        else()
            option(WITH_LAYER_${name} "build with layer ${name}" ON)
        endif()
    
        message("WITH_LAYER_${name} = ${WITH_LAYER_${name}}")
    
        if(WITH_LAYER_${name})
            list(APPEND ncnn_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/layer/${name}.cpp")
    
            # look for arch specific implementation and append source
            # optimized implementation for armv7 aarch64
                if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/layer/arm/${name}_arm.cpp")
                    list(APPEND ncnn_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/layer/arm/${name}_arm.cpp")
                    set(WITH_LAYER_${name}_arm 1)
                endif()
           
        endif()
    
        # generate layer_declaration and layer_registry file
        if(WITH_LAYER_${name})
            if(WITH_LAYER_${name}_arm)
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h
                    "extern Layer* ${class}_arm_layer_creator();
    ")
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h
                    "#if NCNN_STRING
    {"${class}",${class}_arm_layer_creator},
    #else
    {${class}_arm_layer_creator},
    #endif
    ")
            elseif(WITH_LAYER_${name}_x86)
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h
                    "extern Layer* ${class}_x86_layer_creator();
    ")
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h
                    "#if NCNN_STRING
    {"${class}",${class}_x86_layer_creator},
    #else
    {${class}_x86_layer_creator},
    #endif
    ")
            else()
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h
                    "extern Layer* ${class}_layer_creator();
    ")
                file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h
                    "#if NCNN_STRING
    {"${class}",${class}_layer_creator},
    #else
    {${class}_layer_creator},
    #endif
    ")
            endif()
        else()
            file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h "#if NCNN_STRING
    {"${class}",0},
    #else
    {0},
    #endif
    ")
        endif()
    
        # generate layer_type_enum file
        file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h "${class} = ${__LAYER_TYPE_ENUM_INDEX},
    ")
        math(EXPR __LAYER_TYPE_ENUM_INDEX "${__LAYER_TYPE_ENUM_INDEX}+1")
    endmacro()
    
    # create new
    file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h)
    file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h)
    file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h)
    set(__LAYER_TYPE_ENUM_INDEX 0)
    
    # layer implementation
    ncnn_add_layer(AbsVal)
    ncnn_add_layer(ArgMax OFF)
    ncnn_add_layer(BatchNorm)
    ncnn_add_layer(Bias)
    ncnn_add_layer(BNLL)
    ncnn_add_layer(Concat)
    ncnn_add_layer(Convolution)
    ncnn_add_layer(Crop)
    ncnn_add_layer(Deconvolution)
    ncnn_add_layer(Dropout)
    ncnn_add_layer(Eltwise)
    ncnn_add_layer(ELU)
    ncnn_add_layer(Embed)
    ncnn_add_layer(Exp)
    ncnn_add_layer(Flatten)
    ncnn_add_layer(InnerProduct)
    ncnn_add_layer(Input)
    ncnn_add_layer(Log)
    ncnn_add_layer(LRN)
    ncnn_add_layer(MemoryData)
    ncnn_add_layer(MVN)
    ncnn_add_layer(Pooling)
    ncnn_add_layer(Power)
    ncnn_add_layer(PReLU)
    ncnn_add_layer(Proposal)
    ncnn_add_layer(Reduction)
    ncnn_add_layer(ReLU)
    ncnn_add_layer(Reshape)
    ncnn_add_layer(ROIPooling)
    ncnn_add_layer(Scale)
    ncnn_add_layer(Sigmoid)
    ncnn_add_layer(Slice)
    ncnn_add_layer(Softmax)
    ncnn_add_layer(Split)
    ncnn_add_layer(SPP OFF)
    ncnn_add_layer(TanH)
    ncnn_add_layer(Threshold)
    ncnn_add_layer(Tile OFF)
    ncnn_add_layer(RNN OFF)
    ncnn_add_layer(LSTM OFF)
    ncnn_add_layer(BinaryOp)
    ncnn_add_layer(UnaryOp)
    ncnn_add_layer(ConvolutionDepthWise)
    ncnn_add_layer(Padding)
    ncnn_add_layer(Squeeze)
    ncnn_add_layer(ExpandDims)
    ncnn_add_layer(Normalize)
    ncnn_add_layer(Permute)
    ncnn_add_layer(PriorBox)
    ncnn_add_layer(DetectionOutput)
    ncnn_add_layer(Interp)
    ncnn_add_layer(DeconvolutionDepthWise)
    ncnn_add_layer(ShuffleChannel)
    ncnn_add_layer(InstanceNorm)
    ncnn_add_layer(Clip)
    ncnn_add_layer(Reorg)
    ncnn_add_layer(YoloDetectionOutput)
    ncnn_add_layer(Quantize)
    ncnn_add_layer(Dequantize)
    ncnn_add_layer(Yolov3DetectionOutput)
    
    add_library(ncnn STATIC ${ncnn_SRCS})
    
    if(COVERAGE)
        target_compile_options(ncnn PRIVATE --coverage)
    endif()
    
    install(TARGETS ncnn ARCHIVE DESTINATION lib)
    install(FILES
        allocator.h
        blob.h
        cpu.h
        layer.h
        layer_type.h
        mat.h
        modelbin.h
        net.h
        opencv.h
        paramdict.h
        benchmark.h
        ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h
        ${CMAKE_CURRENT_BINARY_DIR}/platform.h
        DESTINATION include
    )

    编译

    git clone https://github.com/Tencent/ncnn
    cd ncnn
    mkdir build
    cd build
    cmake ..
    make -j
    make install

    检查:

    readelf libncnn.a –a

    最后出现

    Tag_Advanced_SIMD_arch: NEONv1  编译正确

  • 相关阅读:
    [zjoi2012]灾难——拓扑排序+灭绝树
    [bzoj3590]Quare——状压DP
    [bzoj4144]Petrol——最小生成树+最短路
    [bzoj2407]探险——重构图+最短路
    [bzoj2725]故乡的梦——最短路+线段树
    [bzoj2118]墨墨的等式——同余最短路
    [loj2736][JOISC 2016 Day3]回转寿司——分块+堆
    PHP学习笔记二十四【Get Set】
    PHP学习笔记二十三【This】
    PHP学习笔记二十二【静态方法二】
  • 原文地址:https://www.cnblogs.com/crazybird123/p/9952256.html
Copyright © 2011-2022 走看看