【问题标题】:OpenCV Cuda "invalid device function" on first cuda call第一次 cuda 调用时 OpenCV Cuda “无效的设备功能”
【发布时间】:2018-03-31 23:02:46
【问题描述】:

我已经成功构建支持 gpu 的 OpenCV 有一段时间了,但是,我遇到了一个我似乎无法解决的情况。在使用 VS 2013 和 CUDA 8.0 构建 OpenCV 3.3 之后,OpenCV cpu 和 gpu 似乎在我的几台测试机器 GTX 750 Ti 和 GTX 950M(均使用 Windows 10)上运行良好。在另一台配备 GTX 1050 Ti 的机器上,cpu 调用工作,但我在第一次 OpenCV-cuda 函数调用时得到“无效的设备函数”。在 CMake 中,我摆弄了 CUDA_ARCH_BIN 和 CUDA_GENERATION 变量并进行了重建,但我似乎无法为这台机器找到解决方案。我已经更新了 NVidia 图形驱动程序,在 3.0、3.5、3.7、5.0 尝试了 CUDA_ARCH_BIN,在 Kepler、Maxwell 和空的情况下尝试了 CUDA_GENERATION。所有这些都在两台测试机器上工作,并且在第三台机器上失败并出现同样的错误。我在网上找到的所有内容都表明这是由 GPU 的计算能力和 CUDA_ARCH_BIN 设置之间的不匹配引起的。我认为如果我设置为 5.0/Maxwell,它将在 Maxwell、Pascals 和更新版本上运行。唯一的另一个变量是 1050 Ti 在 Windows 7 机器上运行,我祈祷这不是问题。或者 VS2013、Cuda 8.0 和/或 OpenCV 3.3 之间可能存在不兼容?任何想法将不胜感激。

【问题讨论】:

  • 我建议为 Pascal 1050 设备添加 arch 6.1/Pascal
  • @RobertCrovella 在我写这个问题时突然想到这可能是问题所在。我认为将 CUDA_ARCH_BIN 设置为 3.0、3.2、3.5、3.7、5.0、5.2 将适用于 6.1 卡。我想也许您想要涵盖的每个计算能力都必须在列表中?无论如何......现在正在建设,并将报告。
  • 这取决于 cmake 如何将这些条目转换为实际的 CUDA 构建开关。如果它指定包含 PTX,那么您是正确的。如果没有,我是对的。由于“无效的设备功能”错误是一个非常确凿的迹象,表明构建的图像中不存在合适的 PTX,我倾向于相信我是正确的,并且与您自己的陈述一致:“我在网络上找到的所有内容表示这是由于 GPU 的计算能力和 CUDA_ARCH_BIN 设置不匹配造成的”

标签: opencv visual-studio-2013 cuda


【解决方案1】:

感谢@RobertCrovella 提供正确答案。只需将 6.1 添加到 CMAKE 中的 CUDA_ARCH_BIN 列表即可解决该问题。所以我最终使用的是 CUDA_ARCH_BIN = 5.0, 5.2, 6.0, 6.1(因为我只对 Maxwell 和 Pascal 感兴趣) 我把 CUDA_GENERATION 留空了。如果您为 CUDA_GENERATION 选择某些内容,它会自动为您填写 CUDA_ARCH_BIN……而对我来说,它给了我比我想要的更多。

旁注:我注意到添加到 CUDA_ARCH_BIN 的架构越多,OpenCV dll 就越大。这完全支持罗伯特在他的 cmets 中所说的话。似乎对于列表中的每个体系结构,该体系结构的特定代码都添加到 dll 中。如果您没有在列表中放置拱门,则代码将不会在该拱门上运行。

现在一切似乎都那么明显了。

再次感谢罗伯特!

对于那些感兴趣的人,这里是我的 CUDA CMAKE 设置:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2015-08-08
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多