多GPU系统中如何确定cv::cuda::GpuMat所在GPU(OpenCV3+CUDA8)
针对你在OpenCV 3 + CUDA 8环境下的需求,有两个简便可靠的方法可以确定cv::cuda::GpuMat所在的GPU设备,我给你详细讲讲:
方法1:直接使用OpenCV GpuMat的原生方法
这是最省心的方案,OpenCV 3已经为GpuMat提供了device()成员函数,它会直接返回该矩阵分配时所在的GPU设备ID。用法非常简单:
// 在你创建foo之后,不管当前设备切换到哪,直接调用 int fooDevice = foo.device(); std::cout << "foo 所在的GPU设备编号是:" << fooDevice << std::endl;
这个方法的优势是完全基于OpenCV的API,不需要直接操作CUDA底层接口,而且内部已经帮你处理了设备跟踪的逻辑,只要GpuMat已经完成内存分配(你的示例里已经初始化了5x5的矩阵,没问题),就能准确返回结果。
方法2:通过CUDA指针属性查询
如果你想通过CUDA原生API来验证,也可以借助cudaPointerGetAttributes函数,通过GpuMat的设备指针来查询所属设备,这在CUDA 8中是完全支持的:
cudaPointerAttributes ptrAttr; // 获取foo的设备内存指针,查询其属性 cudaPointerGetAttributes(&ptrAttr, foo.ptr()); int fooDevice = ptrAttr.device; std::cout << "foo 所在的GPU设备编号是:" << fooDevice << std::endl;
注意这个方法需要你处理CUDA的错误返回值(比如检查cudaPointerGetAttributes的返回是否为cudaSuccess),不过你的示例里忽略错误的话,直接这么写就行。
补充说明
这两个方法之所以有效,是因为当你调用cudaSetDevice()切换设备后,后续的所有CUDA内存分配(包括OpenCVGpuMat内部的分配操作)都会在当前激活的设备上进行,GpuMat会内部记录这个设备ID,或者通过指针的属性可以反向查到所属设备。
推荐优先用方法1,毕竟是OpenCV为GPU矩阵专门设计的接口,代码更简洁也更贴合你的使用场景。
内容的提问来源于stack exchange,提问作者Ken Y-N
相关产品推荐
相关产品推荐

