OpenVINO使用OpenCL内存执行,避免拷贝
生活随笔
收集整理的這篇文章主要介紹了
OpenVINO使用OpenCL内存执行,避免拷贝
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、簡(jiǎn)介
出于性能考慮,通常 CPU 無法滿足耗時(shí)的要求,網(wǎng)絡(luò)需要執(zhí)行在 GPU 上增強(qiáng)性能,而數(shù)據(jù)的處理通常使用 OpenCL 也會(huì)比 CPU 快很多。
所以我們要是可以直接將 OpenCL 處理后的內(nèi)存給 OpenVINO 執(zhí)行,就可以避免將 OpenCL 內(nèi)存拷貝到 CPU 上,再從 CPU 拷貝到 OpenVINO 中。
其實(shí) OpenVINO 已經(jīng)支持直接使用 OpenCL 的內(nèi)存,只要他們公用一個(gè) Context 即可。
二、使用
1.官方資料
本文是基于 OpenVINO 2021 的 SDK 寫的,參考的官方文檔鏈接為:https://docs.openvino.ai/2021.4/openvino_docs_IE_DG_supported_plugins_GPU_RemoteBlob_API.html
另外 OpenVINO 2022 的接口有所變動(dòng),可以參考這篇文檔:https://docs.openvino.ai/latest/openvino_docs_OV_UG_supported_plugins_GPU_RemoteTensor_API.html
2.使用外部cl_context
#include <inference_engine.hpp> #include <gpu/gpu_context_api_ocl.hpp> #include <opencv2/core/ocl.hpp> #include <opencv2/core/opencl/runtime/opencl_core.hpp>using namespace InferenceEngine;// 1.創(chuàng)建 Core ie; auto net = ie.ReadNetwork("network.xml"); // 舉例使用 OpenCV 提供的 cl_context,用者替換為自己的 cl_context cl_context ctx = static_cast<cl_context>(cv::ocl::Context::getDefault().ptr()); auto remote_context = gpu::make_shared_context(mCore, "GPU", ctx); ExecutableNetwork network = ie.LoadNetwork(net, remote_context); InferRequest request = network.CreateInferRequest();// 2.設(shè)置數(shù)據(jù) InputsDataMap& inputs = network.getInputsInfo(); for (auto& input : inputs) {auto& input_name = input.first;InputInfo::Ptr& input_info = input.second;// 這里是 cv::UMat uMat,用者替換為自己的 cl_memcl_mem shared_buffer = static_cast<cl_mem>(umat_in.u->handle);auto shared_blob = gpu::make_shared_blob(input_info->getTensorDesc(), network.GetContext(), shared_buffer);request.SetBlob(input_name, shared_blob); } for (auto& output : outputs) {auto& output_name = output.first; //output也是一個(gè)鍵值對(duì)類型DataPtr& output_info = output.second;// 這里是 cv::UMat uMat,用者替換為自己的 cl_memcl_mem shared_buffer = static_cast<cl_mem>(umat_out.u->handle);auto shared_blob = gpu::make_shared_blob(output_info->getTensorDesc(), network.GetContext(), shared_buffer);request.SetBlob(output_name, shared_blob); }// 3.執(zhí)行 request.Infer();// 4.獲取輸出,輸出數(shù)據(jù)已經(jīng)直接輸出到 umat_out 中了。總結(jié)
以上是生活随笔為你收集整理的OpenVINO使用OpenCL内存执行,避免拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: What's the differenc
- 下一篇: 华为云存储空间图库占比太大_终于知道为什