【问题标题】:OpenCV GPU Mat HangingOpenCV GPU 垫挂
【发布时间】:2016-04-16 04:04:48
【问题描述】:

我想我有一个有趣的问题,很想得到一些帮助。

硬件

2x 相同的机器

  • i-7 4770
  • 华硕主板
  • 8GB 内存
  • GTX 750 (Maxwell)(驱动程序版本 335.23)

软件

  • VS2010
  • VS2012
  • OpenCV 2.4.5(在 Kepler 硬件上编译)
  • 库达 5.0

正如标题所说,当我尝试创建 OpenCV GpuMat (cv::gpu::Gpumat) 时,程序将“挂起”。我的意思是不会发生进一步的处决。有趣的是,CUDA 安装成功,OpenCV 头文件是使用 CMake 编译的,并且已经在其他计算机上验证过(并且gpu::setDevice() 在当前机器上不会返回错误),并且程序偶尔会运行。下面的代码是我正在测试的。

在下面的实现中,代码将挂在gpuMat_1.upload(cpuMat_1)。以前(当作为基准测试以确保某些部分正常工作时),gpuMat.upload 将完成。在确认在两台相同的机器上(每台都有 GTX 750)后,两者都被提升到有 2 个上传和一个添加(当前显示)并且不会完成第一次上传。当第二次上传被删除,并随之添加,它仍然在第一次上传期间挂起。

感谢您的帮助。如果还有什么我应该补充的,或者有助于澄清问题的,请询问。

#include <iostream>
#include <opencv2\gpu\gpu.hpp>

int main()
{
    std::cout << "Number of gpu devices: " << cv::gpu::getCudaEnabledDeviceCount() << std::endl;

    cv::Mat cpuMat_1, cpuMat_2;
    cv::gpu::GpuMat gpuMat_1, gpuMat_2, gpuMat_3;

    cpuMat_1 = cv::Mat::ones(4, 4, CV_8SC1);
    cpuMat_2 = cv::Mat::ones(4, 4, CV_8SC1);

    gpuMat_1.upload(cpuMat_1);
    std::cout << "Help." << std::endl;
    gpuMat_2.upload(cpuMat_2);
    std::cout << "Please, help." << std::endl;

    cv::gpu::add(gpuMat_1, gpuMat_2, gpuMat_3);

    std::cout << "Help has come." << std::endl;

    system("PAUSE");
    return 0;
}

更新:我最近在其中一个单元上重新编译了 OpenCV(以考虑硬件更改)并且遇到了同样的问题。

【问题讨论】:

  • 335.23。我现在就加,谢谢提醒。
  • 您应该有用于 OpenCV 库的 .pdb 文件,尝试在调试器中运行它并使用中断/断点并单步执行/跳过以了解它在挂起之前/何时执行的操作。它是否进入某种循环、挂起 CUDA 调用等。这可能有助于诊断问题。
  • 在当前的实现(上面的代码)中,我在 gpuMat_1.upload 处添加了一个断点,并且“显示下一条语句”我没有看到任何东西,“Step Into”导致它挂起。早些时候,我将 GpuMat 初始化更改为指针,它将进入构造函数,仅在调用“create”时挂起。编辑:语法。

标签: c++ opencv cuda


【解决方案1】:

这个问题原来是与 OpenCV 2.4.5 和新的 Maxwell 架构不兼容。我能够将我的手放在 Quadro 600 上并安装它来测试它,它运行良好。然后我用 GTX 650 对其进行了测试,它也可以工作。然后我使用 650 上的 mog2 运动检测库对其进行了测试,它也可以工作。

【讨论】:

  • 你知道 OpenCV 2.4.9 是否兼容 Maxwell 架构吗?我刚买了一个用于 OpenCV 的 GeForce 750 Ti!希望我几周前读过这篇文章。
  • 我现在不能肯定地回答这个问题。我们最终会更新我们所有的库,但不知道什么时候。如果你测试它,请告诉我。
  • 搞定了。事实证明,Maxwell 使用了新的架构 50。看看:docs.nvidia.com/maxwell-compatibility-guide。只需将 CUDA_ARCH_BIN 设置为 1.1 2.0 3.0 3.5 5.0 并将 CUDA_ARCH_PTX 设置为 5.0 这告诉 NVCC 为 1.1-5.0 架构创建二进制代码(准备运行),并为 5.0 创建 PTX(JIT 编译),这样如果你编写任何 5.0 特定代码,它向后兼容其他架构。希望这会有所帮助。
  • 那些设置(CUDA_ARCH_PTX 和 CUDA_ARCH_BIN)在 CMake 中...以防不清楚。 :-)
  • 太棒了,我记得检查过它们,但没有得到相同的结果...我会很快再试一次并进行测试。可能只是我忘记了其中一个盒子,因为我是根据同事最初告诉我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多