MNN aarch64平台交叉编译
MNN是一个非常实用的深度学习推理框架,今天在华为笔记本ubuntu18.04上进行MNN的交叉编译,并在全志T507进行部署
2、环境配置
(1) MNN选择master版本(1.2.0tag版本有错误)
(2)下载linaro交叉编译环境, 我的是aarch64,
3. 下面就可以开始编译MNN了, MNN目录下:
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DMNN_BUILD_DEMO=ON \
-DMNN_BUILD_BENCHMARK=true \
-DCMAKE_SYSTEM_NAME=Linux \
-DMNN_BUILD_QUANTOOLS=true \
-DMNN_USE_INT8_FAST=true \
-DMNN_BUILD_TEST=true\
-DMNN_OPENCL=ON \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 -DCMAKE_C_COMPILER=/shihj_mnt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/shihj_mnt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \
-DCMAKE_INSTALL_PREFIX=/shihj_mnt/MNN_OPENCL_INSTALL \
# -DMNN_BUILD_CONVERTER=true \
make -j4
面加上了build_demo和build_bencmark两个flag, 为了方便后面的测试。编译完成后,将其copy到板子上, 同时也要将 bencmark/models文件夹copy到板子上,这里面都是mnn模型库, 后面会用到。
-DMNN_BUILD_CONVERTER=true 编译报错,转换在本地转
测试
benchmark.out models_folder [loop_count] [warmup] [forwardtype] [numberThread] [precision]
2、在source/backend/opencl/core/runtime中OpenCLWarpper.cpp中文件进行修改。否则在编译过程中不报错,而在执行过程报以下错误:
OpenCL init error, fallback ..
例如我们使用全志T507的liunx系统进行开发,需要把liunx下opencl链接库进行添加和修改
static const std::vector<std::string> gOpencl_library_paths = {
#if defined(__APPLE__) || defined(__MACOSX)
"libOpenCL.so", "/System/Library/Frameworks/OpenCL.framework/OpenCL"
#elif defined(__ANDROID__)
"libOpenCL.so",
"libGLES_mali.so",
"libmali.so",
#if defined(__aarch64__)
// Qualcomm Adreno
"/system/vendor/lib64/libOpenCL.so",
"/system/lib64/libOpenCL.so",
// Mali
"/system/vendor/lib64/egl/libGLES_mali.so",
"/system/lib64/egl/libGLES_mali.so",
#else
// Qualcomm Adreno
"/system/vendor/lib/libOpenCL.so", "/system/lib/libOpenCL.so",
// Mali
"/system/vendor/lib/egl/libGLES_mali.so", "/system/lib/egl/libGLES_mali.so",
// other
"/system/vendor/lib/libPVROCL.so", "/data/data/org.pocl.libs/files/lib/libpocl.so"
#endif
#elif defined(__linux__)
// "/usr/lib/libOpenCL.so",
// "/usr/local/lib/libOpenCL.so",
// "/usr/local/lib/libpocl.so",
// "/usr/lib64/libOpenCL.so",
// "/usr/lib32/libOpenCL.so",
// "libOpenCL.so"
"/gzy_mnt/SDK/aarch64-linux-gnu-7.4.1/lib64/libmali.so.0", //添加opencl动态链接库的路径
"/gzy_mnt/SDK/aarch64-linux-gnu-7.4.1/lib64/libOpenCL.so.2"
/*
* 0: System32, 1: SysWOW64
* --------------------------------------
* | Real CPU / | x64 | x86 |
* | / Target CPU | | |
* --------------------------------------
* | x64 | 0 / 1 | 1 |
* --------------------------------------
* | x86 | Error | 0 |
* --------------------------------------
* 0 / 1: 0 if OpenCL.dll (System32, 64bit on x64), otherwise 1 (SysWOW64, 32bit compatible on 64bit OS)
*/
#elif defined(_WIN64)
"C:/Windows/System32/OpenCL.dll",
"C:/Windows/SysWOW64/OpenCL.dll"
#elif defined(_WIN32)
"C:/Windows/SysWOW64/OpenCL.dll",
"C:/Windows/System32/OpenCL.dll"
#endif
};