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

server/2025/1/15 14:53:01/

cudaHostMem_0">不使用cv::cuda::HostMem的情况

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

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的方式

cudaHostMem_13">使用cv::cuda::HostMem的情况

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


http://www.ppmy.cn/server/28280.html

相关文章

维修家政按摩到家上门小程序开源版开发

维修家政按摩到家上门小程序开源版开发 智能定位,精准计费——全新上门服务平台功能解析。 全新上门服务平台已经上线,它拥有一系列强大的功能,旨在为用户提供最便捷、最个性化的服务体验。 !](https://img-blog.csdnimg.cn/direct/86195e…

jQuery学习笔记

jQuery 一、jQuery 概述 JavaScript 库 常见的 JavaScript 库 jQueryPrototypeYUIDojoExt JS移动端的 zepto 二、jQuery 的基本使用 1、使用步骤 引入 jQuery 文件 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset&…

Linux下的Git指令操作

1.安装git sudo apt-get install git 2.本地拉取已有仓库项目(红色部分请替换) git clone https://github.com/test/test.git 3. 上传本地新增内容&#xff08;文本或文件夹&#xff09; git add XXX 4.添加新增内容说明 git commit -m XXXX 5. 将本地仓库同步修改到远程仓库 …

C# WinForm —— 11 ListBox介绍

1. 简介 列表框&#xff0c;可以从中选择一项或多项 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 lb开头BackColor背景颜色BoderStyle边框样式&#xff1a;无、FixedSingle、Fixed3DDataSource指示此控件将用来获取其项的列表&#xff0…

Pandas入门篇(三)-------数据可视化篇1(matplotlib篇)

目录 概述一、pyplot模式&#xff08;pyplot API&#xff09;&#xff1a;二、面向对象模式&#xff08;Object-Oriented API&#xff09;&#xff1a;三、创建图表详细流程&#xff08;一&#xff09;创建画布&#xff08;figure&#xff09;1.函数格式2.参数解释3.返回值 &am…

Qwen-Audio:推动通用音频理解的统一大规模音频-语言模型(开源)

随着人工智能技术的不断进步&#xff0c;音频语言模型&#xff08;Audio-Language Models&#xff09;在人机交互领域变得越来越重要。然而&#xff0c;由于缺乏能够处理多样化音频类型和任务的预训练模型&#xff0c;该领域的进展受到了限制。为了克服这一挑战&#xff0c;研究…

MybatisPlus学习笔记

具体源码见&#xff1a; https://github.com/cug-lucifer/mp-demo/tree/master 快速入门 入门案例 需求&#xff1a; 新增用户功能根据id查询用户根据id批量查询用户根据id更新用户根据id删除用户 使用MybatisPlus的基本步骤 引入MybatisPlus依赖&#xff0c;代替Mybatis…

一加Ace3/12/Ace2pro手机ColorOS14刷KernelSU内核ROOT-解决无限重启变砖

一加Ace3/一加12/一加11等手机升级了安卓14底层&#xff0c;并且ColorOS版本也更新到了14版本界面和功能都比之前的系统表现更加优秀&#xff0c;但刷机方面&#xff0c;相对之前存在一些差异&#xff0c;特别是KernelSU内核级别root权限&#xff0c;不再支持一键刷入KernelSU通…