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

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

相关推荐
dazzle7 分钟前
计算机视觉处理(OpenCV基础教学(十九):图像轮廓特征查找技术详解)
人工智能·opencv·计算机视觉
柳鲲鹏5 小时前
OpenCV视频实时跟踪目标,多种算法,python版
opencv·算法·音视频
sali-tec6 小时前
C# 基于OpenCv的视觉工作流-章7-膨胀
图像处理·人工智能·opencv·算法·计算机视觉
格林威18 小时前
传送带上运动模糊图像复原:提升动态成像清晰度的 6 个核心方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·ai·halcon·工业相机
纪伊路上盛名在1 天前
如何为我们的GPU设备选择合适的CUDA版本和Torch版本?
pytorch·深度学习·torch·cuda·英伟达
dazzle1 天前
计算机视觉处理(OpenCV基础教学(十七):图像轮廓检测技术详解)
人工智能·opencv·计算机视觉
寻找华年的锦瑟1 天前
Qt-YOLO-OpenCV
qt·opencv·yolo
abcd_zjq1 天前
VS2022+QT6.9配置ONNXruntime GPU、CUDA、cuDNN(附官网下载链接)(GPU开启代码示例)
qt·visual studio·cuda·onnx
却道天凉_好个秋1 天前
OpenCV(五十三):Haar人脸识别
人工智能·opencv·目标跟踪·haar人脸识别
柠檬07112 天前
opencv mat 统计小于0的个数
人工智能·opencv·计算机视觉