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

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

相关推荐
jndingxin1 小时前
OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
人工智能·opencv·计算机视觉
知舟不叙2 小时前
OpenCV中的SIFT特征提取
人工智能·opencv·计算机视觉
__lost5 小时前
Python图像变清晰与锐化,调整对比度,高斯滤波除躁,卷积锐化,中值滤波钝化,神经网络变清晰
python·opencv·计算机视觉
豆豆6 小时前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
猿饵块9 小时前
opencv--图像变换
人工智能·opencv·计算机视觉
jndingxin10 小时前
OpenCV 图形API(63)图像结构分析和形状描述符------计算图像中非零像素的边界框函数boundingRect()
人工智能·opencv·计算机视觉
暴龙胡乱写博客12 小时前
OpenCV---图像预处理(四)
人工智能·opencv·计算机视觉
正在走向自律13 小时前
AI数字人:繁荣背后的伦理困境与法律迷局(8/10)
人工智能·python·opencv·语音识别·ai数字人·ai伦理与法律
PLUS_WAVE15 小时前
【CUDA 编译 bug】ld: cannot find -lcudart
服务器·c++·bug·环境·编译·cuda·ld
起个破名想半天了1 天前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉