opencv GPU加速 多GPU卡指定GPU索引方法

opencv最近版本对GPU加速提供了很好的支持, 使用起来也非常方便,DNN模块默认使用第一个GPU卡进行加速,当我们建立多个检测任务,并且电脑包含多个GPU的时候,我们更希望把每个模型分配到不同的GPU卡上,发挥多个GPU卡的加速效果。

opencv提供了设置GPU卡的接口,也很简单,本文例子测试使用opencv4.4版本,并且编译为支持GPU版本。

GPU版本编译方法可参考这里

一、 函数接口说明

接口在opencv2\core\cuda.hpp 中,函数声明如下。

/** @brief Sets a device and initializes it for the current thread.

@param device System index of a CUDA device starting with 0.

If the call of this function is omitted, a default device is initialized at the fist CUDA usage.
 */
CV_EXPORTS_W void setDevice(int device);

看函数说明, 函数可以为当前线程设置一个设备并且初始化它。 可以理解为 函数对当前线程有效,每个线程需要单独设置,否则就使用默认的第一个GPU卡。

cuda_info.cpp中函数实现如下:

void cv::cuda::setDevice(int device)
{
#ifndef HAVE_CUDA
    CV_UNUSED(device);
    throw_no_cuda();
#else
    cudaSafeCall( cudaSetDevice(device) );
    cudaSafeCall( cudaFree(0) );
#endif
}

 

二、调用方法

有了这个函数,指定GPU序号就很简单了

首先 头文件中包含 cuda.hpp

#include <opencv2/core/cuda.hpp>

然后,在调用setPreferableBackend之前调用setDevice就可以了。

cv::dnn::Net netDetect = cv::dnn::readNet( (const char *)model_file.c_str(), (const char *)config_file.c_str());
cv::cuda::setDevice(nGpuId);
netDetect.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
netDetect.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

三、测试

测试及遗留问题:

因为这个函数是线程相关的,也就存在了三种不同的情况

1、单线程一个模型,设置一个GPU序号。 

2、单线程多个模型,设置一个GPU序号,线程内模型使用同一个GPU卡。

3、单线程多个模型,并且把模型分配到不同的GPU卡上。

 

本文测试电脑4个GPU卡,分4个线程将模型跑在4个卡上, 运行正常。

其它情况有需要请读者自行测试。 

欢迎留言讨论!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡笔小心点

你的鼓励是我创造的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值