目前还没有完全确认使用的正确性,使用OpenCL的推理速度远慢于CPU的推理速度
D4: RK3399上MNN的OpenCL推理
1. MNN的OpenCL支持
可以在CMakeLists.txt里直接修改,打开OpenCL支持
1 2 3 4 5 6 7 8 9 10 11
| 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
| 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); ... }
|