环境要求
- cmake(建议使用3.10或以上版本)、
- protobuf(使用3.0或以上版本)
- gcc(使用4.9或以上版本)
编译选项
使用cmake
编译时,可以修改CMakeLists.txt
中的选项:
- MNN_DEBUG
默认关闭,关闭时,不保留符号,开启优化。
- MNN_OPENMP
默认开启,关闭后,禁用openmp多线程优化。
- MNN_OPENCL
默认关闭,开启后,编译OpenCL部分,可以通过指定MNN_FORWARD_OPENCL利用GPU进行推理。
- MNN_OPENGL
默认关闭,开启后,编译OpenGL部分,可以通过指定MNN_FORWARD_OPENGL利用GPU进行推理。
- MNN_VULKAN
默认关闭,开启后,编译Vulkan部分,可以通过指定MNN_FORWARD_VULKAN利用GPU进行推理。
- MNN_METAL
默认关闭,开启后,编译Metal部分,可以通过指定MNN_FORWARD_METAL利用GPU进行推理,仅限iOS或macOS上开启。
- MNN_ARM82
默认关闭,开启后,编译Arm8.2部分,用Arm8.2+扩展指令集实现半精度浮点计算(fp16)和int8(sdot)加速
使用Arm82+扩展指令的方法如下:
// 创建session需要的配置
MNN::ScheduleConfig config;
// 选择Backend
config.type = MNN_FORWARD_CPU;
// 线程数
config.numThread = 2;
// 配置相应的Backend
BackendConfig backendConfig;
// 选择低精度
backendConfig.precision = BackendConfig::Precision_Low;
config.backendConfig = &backendConfig;
具体步骤
准备工作
(可选,修改 MNN Schema 后需要)
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh # 可选,模型仅demo工程需要
本地编译
mkdir build && cd build && cmake .. && make -j8
编译完成后本地出现MNN的动态库。
交叉编译
由于交叉编译的目标设备及厂商提供的编译环境类型众多,本文恕无法提供手把手教学。 以下是大致流程,请按照具体场景做相应修改。
交叉编译大致上分为以下两个步骤,即获取交叉编译器以及配置CMake进行交叉编译。
获取交叉编译工具链
以Linaro工具链为例。首先从 https://releases.linaro.org/components/toolchain/binaries/latest-7/ 网页中按照宿主机以及交叉编译目标设备来选择合适的工具链。这里我们以 arm-linux-gnueabi
为例,点击网页上的链接,进入 https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/ 页面。 按照宿主机类型(这里以X64 Linux为例)选择下载链接, 文件名形如 [gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz](https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz)
下载后解压到任意目录。
配置交叉编译CMake
Toolchain 法
对于常用的交叉编译配置,工具链提供方或网络上可能已经有现成的CMake Toolchain。 这种情况下使用如下命令即可:
mkdir build
cd build
cmake 其他CMake参数 /MNN/源码/路径 -DCMAKE_TOOLCHAIN_FILE=CMake/Toolchain/文件/路径
注意部分这类CMake Toolchain中会写死你的交叉编译工具链路径,您可能需要手动编辑这些CMake Toolchain文件进行修改
手动配置法
mkdir build && cd build
cmake .. \
-DCMAKE_SYSTEM_NAME=宿主系统,例如Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_SYSTEM_PROCESSOR=交叉编译目标处理器的信息。例如arm或aarch64 \
-DCMAKE_C_COMPILER=交叉编译器中C编译器的路径 \
-DCMAKE_CXX_COMPILER=交叉编译器中C++编译器的路径
例子
还是以Linaro ARM64为例:
下载aarch64交叉编译工具链
mkdir -p linaro/aarch64
cd linaro/aarch64
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
tar xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
构建、编译
export cross_compile_toolchain=linaro/aarch64
mkdir build && cd build
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_C_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=$cross_compile_toolchain/bin/aarch64-linux-gnu-g++
make -j4
Ubuntu
安装opencl sdk(可选)
sudo apt install ocl-icd-opencl-dev
编译构建
mkdir build && cd build
cmake ..
make -j8
注:部分linux系统会出现执行不到openclbackend,需要手动dlopen mnn_opencl.so。