【发布时间】:2019-07-29 18:02:51
【问题描述】:
我正在运行 cv::cuda::StereoBM,它可以在 Tesla K80 上找到。 (计算能力 3.7。)完全相同的代码,完全相同的系统库,它挂在 Geforce RTX 2080 Ti 上。 (计算能力 7.5。)我在系统上找到了其他 CUDA 代码。
特别是,这是挂起的代码:
cv::Ptr<cv::StereoBM> sbm_ptr = cv::cuda::createStereoBM();
sbm_ptr->compute(gpu_left, gpu_right, gpu_result);
// .. this line of code is never reached.
我已经仔细检查了 OpenCV 的 cuda::DeviceInfo::isCompatible,它列出了我的设备确实兼容。
我想知道如何调试它。
【问题讨论】:
-
您应该为此类问题添加什么版本的 OpenCV 和 CUDA,这样它也可以帮助人们调试并随着时间的推移保持问题的相关性。
-
source code 可以帮助您查明挂起的确切线路。您可以尝试简单地复制/粘贴源代码并适当地更改变量名称。
-
因此,OpenCV 4.0.0 和 4.0.1 无法构建...与 NVCC 的配置有关。问题出现在 OpenCV 3.4.4 和 3.4.5 上(这就是我尝试过的全部。)我必须将 std=c++03 传递给 NVCC 才能构建 cuda 部件。我在 Tesla K80 机器和 Gefore RTX 2080 Ti 机器上都使用了 CUDA 10.0。我的代码真的和上面的 sn-p 一样简单。我想我可以深入研究 OpenCV 代码以确定它挂在哪一行。
-
这段代码如下:(不知道如何让栈溢出来正确格式化) cv::cuda::GpuMat gpu_left{left}; cv::cuda::GpuMat gpu_right{right}; cv::cuda::GpuMat gpu_result; sbm_ptr->计算(gpu_left,gpu_right,gpu_result); // ... 这行代码永远不会到达 gpu_result.download(result);
-
好吧,如果这是一个已知的错误,我个人不知道,这就是我不回答这个问题的原因。就像我说的,尝试用该方法的完整源代码(我链接的)替换
sbm_ptr->compute调用。这有望帮助您查明导致其挂起的确切 OpenCV 调用。