0%

D4:RK3399上MNN的OpenCL推理

目前还没有完全确认使用的正确性,使用OpenCL的推理速度远慢于CPU的推理速度

D4: RK3399上MNN的OpenCL推理

1. MNN的OpenCL支持

可以在CMakeLists.txt里直接修改,打开OpenCL支持

1
2
3
4
5
6
7
8
9
10
11
# backend options
option(MNN_METAL "Enable Metal" OFF)
option(MNN_OPENCL "Enable OpenCL" ON)
option(MNN_OPENGL "Enable OpenGL" OFF)
option(MNN_VULKAN "Enable Vulkan" OFF)
option(MNN_ARM82 "Enable ARM82" OFF)
option(MNN_ONEDNN "Enable oneDNN" OFF)
option(MNN_AVX512 "Enable AVX512" OFF)
option(MNN_CUDA "Enable CUDA" OFF)
option(MNN_TENSORRT "Enable TensorRT" OFF)
option(MNN_COREML "Enable CoreML" OFF)

如果是交叉编译,为了方便起见,关闭MNN_USE_SYSTEM_LIB不使用系统中的依赖库

1
2
# build options
option(MNN_USE_SYSTEM_LIB "For opencl and vulkan, use system lib or use dlopen" OFF)

编译后会生成libMNN_CL.so库。

2. MNN推理配置

在创建会话的时候,通过修改配置,让MNN使用OpenCL进行推理。

1
2
3
4
std::shared_ptr<MNN::Interpreter> net(MNN::Interpreter::createFromFile(_param_path.c_str()));
MNN::ScheduleConfig config;
config.type = MNN_FORWARD_OPENCL;
session = net->createSession(config);

3. 主函数修改

为了能够正确调用OpenCL,需要在main函数中手动加载libMNN_CL.so库。否则MNN会报错找不到OpenCL backend。

1
2
3
4
5
6
#include <dlfcn.h>
int main(int argc, char *argv[])
{
dlopen("libMNN_CL.so", RTLD_NOW);
...
}