CUDA 模块介绍 OpenCV v4.8.0

概况

OpenCV CUDA 模块是一组利用 CUDA 计算能力的类和函数。它使用英伟达™(NVIDIA®)* CUDA* Runtime API 实现,仅支持英伟达™(NVIDIA®)GPU。OpenCV CUDA 模块包括实用功能、低级视觉基元和高级算法。实用功能和底层基元为利用 CUDA 开发快速视觉算法提供了强大的基础架构,而高级功能则包括一些最先进的算法(如立体对应、人脸和人物检测器等),可供应用程序开发人员使用。

CUDA 模块设计为主机级应用程序接口。这意味着,如果您有预编译的 OpenCV CUDA 二进制文件,则无需安装 CUDA 工具包或编写任何额外代码即可使用 CUDA。

OpenCV CUDA 模块设计简单易用,无需任何 CUDA 知识。不过,这种知识对于处理非难情况或实现最高性能肯定是有用的。了解各种操作的成本、GPU 的作用、首选的数据格式等都会有所帮助。CUDA 模块是快速实施 CUDA 加速计算机视觉算法的有效工具。但是,如果您的算法涉及许多简单的操作,为了获得最佳性能,您可能仍需要编写自己的内核,以避免对中间结果进行额外的写入和读取操作。

要启用 CUDA 支持,请使用 CMake 以 WITH_CUDA=ON 配置 OpenCV。设置该标志后,如果已安装 CUDA,则会构建全功能 OpenCV CUDA 模块。否则,模块仍会被构建,但在运行时,模块中的所有函数都会抛出带有 CV_GpuNotSupported 错误代码的 Exception,cuda::getCudaEnabledDeviceCount() 除外。在这种情况下,后一个函数返回的 GPU 数量为零。在不支持 CUDA 的情况下构建 OpenCV 不会执行设备代码编译,因此不需要安装 CUDA 工具包。因此,使用 cuda::getCudaEnabledDeviceCount() 函数,可以实现一种高级算法,在运行时检测 GPU 是否存在,并相应地选择合适的实现(CPU 或 GPU)。

针对不同 NVIDIA* 平台进行编译

NVIDIA* 编译器可生成二进制代码(cubin 和 fatbin)和中间代码(PTX)。二进制代码通常意味着特定的 GPU 架构和生成,因此无法保证与其他 GPU 的兼容性。PTX 针对的是完全由功能或特性集定义的虚拟平台。根据所选虚拟平台的不同,即使真实硬件支持所有功能,某些指令也会被模拟或禁用。

在首次调用时,PTX 代码会使用 JIT 编译器编译成特定 GPU 的二进制代码。当目标 GPU 的计算能力(CC)低于 PTX 代码时,JIT 编译就会失败。默认情况下,OpenCV CUDA 模块包括

  • 计算能力 1.3 和 2.0 的二进制文件(由 CMake 中的 CUDA_ARCH_BIN 控制)
  • 计算能力 1.1 和 1.3 的 PTX 代码(由 CMake 中的 CUDA_ARCH_PTX 控制)

这意味着,对于具有 CC 1.3 和 2.0 的设备,二进制镜像已可运行。对于所有较新的平台,1.3 的 PTX 代码会被 JIT 为二进制映像。对于使用 CC 1.1 和 1.2 的设备,1.1 的 PTX 代码已 JIT’ed。对于使用 CC 1.0 的设备,没有代码可用,函数会抛出异常。对于首先执行 JIT 编译的平台,运行速度较慢。

在使用 CC 1.0 的 GPU 上,仍然可以编译 CUDA 模块,而且大部分函数都能完美运行。为此,请在二进制文件列表中添加 “1.0”,例如,CUDA_ARCH_BIN=“1.0 1.3 2.0” 。无法在 CC 1.0 GPU 上运行的函数会出现异常。

您可以在运行时确定 OpenCV GPU 内置二进制文件(或 PTX 代码)是否与您的 GPU 兼容。函数 cuda::DeviceInfo::isCompatible 可返回兼容性状态(true/false)。

利用多个 GPU

在当前版本中,每个 OpenCV CUDA 算法只能使用一个 GPU。因此,要利用多个 GPU,必须在 GPU 之间手动分配工作。可以使用 cuda::setDevice() 函数切换活动设备。详情请阅读《Cuda C 编程指南》。

在为多个 GPU 开发算法时,请注意数据传递开销。对于原始函数和小型图像而言,数据传递开销可能会很大,这可能会消除使用多个 GPU 的所有优势。但对于高级算法,可以考虑使用多 GPU 加速。例如,立体图像块匹配算法已经通过以下算法成功实现了并行化:

  1. 将每对立体图像分割成两个水平重叠的条纹。
  2. 在单独的 Fermi* GPU 上处理每对条纹(来自左右图像)。
  3. 将结果合并为一个单一的差异图。

采用这种算法后,双 GPU 的性能比单 Fermi GPU 提高了 180%。有关源代码示例,请参见 https://github.com/opencv/opencv/tree/4.x/samples/gpu/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值