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

不使用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不需要持续访问该内存区域,使用普通内存拷贝可能是足够的。

相关推荐
没有不重的名么1 天前
Multiple Object Tracking as ID Prediction
深度学习·opencv·计算机视觉·目标跟踪
愚者游世1 天前
Opencv知识点大纲
人工智能·opencv·计算机视觉
格林威1 天前
Baumer相机电池极耳对齐度检测:提升叠片工艺精度的 5 个实用方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·视觉检测·工业相机·堡盟相机
403240731 天前
【Jetson开发避坑】虚拟环境(Conda/Venv)调用系统底层OpenCV与TensorRT的终极指南
人工智能·opencv·conda
格林威1 天前
Baumer相机电机转子偏心检测:实现动平衡预判的 5 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·深度学习·opencv·机器学习·计算机视觉·视觉检测·工业相机
侯孟禹1 天前
Gemini写的抠图工具
qt·opencv
qwy7152292581631 天前
17-像素点和ROI操作
人工智能·opencv·计算机视觉
茶栀(*´I`*)1 天前
OpenCV实战:从视频读写到高级目标追踪(MeanShift与CamShift详解)
图像处理·opencv·计算机视觉
Qt学视觉2 天前
3D3-PCL全面总结
c++·opencv·3d
智驱力人工智能2 天前
景区节假日车流实时预警平台 从拥堵治理到体验升级的工程实践 车流量检测 城市路口车流量信号优化方案 学校周边车流量安全分析方案
人工智能·opencv·算法·安全·yolo·边缘计算