使用零拷贝技术加速视频图像操作

不使用cv::cuda::HostMem的情况

当直接创建cv::cuda::GpuMat并从CPU内存拷贝数据到GPU时,如果没有共享内存机制,数据传输是通过常规的内存拷贝完成的,例如:

c 复制代码
uchar* nv12Data; // CPU内存中的NV12数据
cv::Mat hostImage(height * 3 / 2, width, CV_8UC1, nv12Data); // 创建一个指向相同内存的cv::Mat
cv::cuda::GpuMat gpuImage; // 创建一个空的GpuMat
cv::cuda::Stream stream; // 创建CUDA流用于异步操作
cv::cuda::registerBuffer(&gpuImage, hostImage.ptr(), hostImage.step.p[0], hostImage.size(), cv::cuda::MEM_HOST_TO_DEVICE); // 注册内存以便CUDA可以访问
cv::cuda::memcpyAsync(gpuImage, hostImage, stream); // 异步拷贝数据到GPU
stream.waitForCompletion(); // 等待数据传输完成

这个在一定程序上,如果存在连续操作,使用异步方式是可以加速的,依然有瓶颈,使用cv::cuda::memcpyAsync()将CPU内存中的数据异步拷贝到GPU。这种情况下,数据是从CPU主存直接拷贝到GPU显存,拷贝过程可能会受到PCIe带宽限制,尤其当数据量较大时,拷贝可能成为瓶颈。下面我们能使用hostmem的方式

使用cv::cuda::HostMem的情况

c 复制代码
uchar* nv12Data; // CPU内存中的NV12数据
cv::cuda::HostMem hostMem(width * height * 3 / 2, CV_8UC1, cv::cuda::HostMem::PAGE_LOCKED | cv::cuda::HOST_MEM_WRITE_COMBINING, nv12Data); // 创建HostMem对象并关联到CPU内存
cv::cuda::GpuMat gpuImage(hostMem); // 直接从HostMem创建GpuMat

// 或者直接在创建GpuMat时使用HostMem:
cv::cuda::GpuMat gpuImage(height * 3 / 2, width, CV_8UC1, cv::cuda::HostMem::create(nv12Data, width * height * 3 / 2, cv::cuda::HOST_MEM_WRITE_COMBINING));

使用cv::cuda::HostMem时,数据已经在CPU内存中被标记为适合与GPU共享,这样可以利用零拷贝技术或页锁定内存(Page-Locked Memory),减少数据在CPU和GPU之间来回拷贝的时间消耗。特别是当应用程序频繁读写同一块内存区域并且GPU和CPU都需要访问时,使用HostMem可以显著提高性能。

总结

总结起来,使用cv::cuda::HostMem的主要优点在于:

减少数据拷贝:利用CUDA的零拷贝技术,可以避免不必要的内存复制,提高数据交互效率。优化内存访问:通过设置合适的内存属性(如OST_MEM_WRITE_COMBINING),可以提高内存访问性能。请注意,实际效果取决于硬件环境、CUDA驱动支持以及具体的应用场景。对于现代GPU架构,特别是在支持统一内存访问(UMA)或非一致性内存访问(NUMA)的系统上,使用HostMem可以获得更好的性能优势。但在某些情况下,如果数据仅需一次性传递或GPU不需要持续访问该内存区域,使用普通内存拷贝可能是足够的。

相关推荐
深度研习笔记8 小时前
OpenCV工业视觉进阶14|SQLite违规数据库存储+历史记录查询+Excel报表导出,完成项目商用数据闭环(验收必备)
数据库·opencv·sqlite
深度研习笔记19 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
深度研习笔记1 天前
OpenCV工业视觉实战06|ROI区域截取+局部精细化检测,锁定作业区域、屏蔽无效背景,大幅提升YOLO检测准确率
人工智能·opencv·yolo
fai厅的秃头姐!1 天前
OpenCV-基础篇
人工智能·opencv·计算机视觉
丨白色风车丨1 天前
OpenCV 基于 HSV 颜色空间实时颜色分割(摄像头蓝色识别)
人工智能·opencv·计算机视觉·hsv颜色识别·python计算机视觉
深度研习笔记1 天前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
在世修行2 天前
高斯模糊与图像去噪
opencv·gaussianblur
xgc_java2 天前
在Java里把ONNX/OpenCV/FFmpeg跑稳:28篇bytedeco实战小册完整指南
java·opencv·ffmpeg
在世修行3 天前
二值化技术详解
图像处理·opencv·计算机视觉·二值化
小保CPP3 天前
OCR C++ Tesseract从OpenCV中获取图片
c++·人工智能·opencv·ocr·模式识别·光学字符识别