OpenCV Cuda“无效的设备功能”第一次拨打电话

OpenCV Cuda“无效的设备功能”第一次拨打电话

问题描述:

我一直在成功使用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图形驱动程序,尝试CUDA_ARCH_BIN在3.0,3.5,3.7,5.0和开普勒,麦克斯韦的CUDA_GENERATION,并且是空的。所有工作都在两台测试机器上,并且在第三台机器上出现同样的错误。我在网上发现的一切都表明,这是由于GPU的计算能力与CUDA_ARCH_BIN设置不匹配造成的。我认为如果我为5.0/Maxwell设置,它将在Maxwell,Pascals和更新的版本上运行。唯一的其他变量是1050 Ti在Windows 7机器上运行,我祈祷这不是问题。或者,VS2013,Cuda 8.0和/或OpenCV 3.3之间可能存在不兼容问题?任何想法将不胜感激。OpenCV Cuda“无效的设备功能”第一次拨打电话

+2

我建议增加拱6.1 /帕斯卡尔,因为我在写这个问题,这是发生在我的帕斯卡尔1050设备 –

+0

@RobertCrovella可能是问题。我认为将CUDA_ARCH_BIN设置为3.0,3.2,3.5,3.7,5.0,5.2可以在6.1卡上工作。我想可能*你想覆盖的每一个*计算能力必须在列表中?无论如何...现在建设,并会报告回来。 –

+2

这取决于cmake如何将这些条目转换为实际的CUDA构建开关。如果它指定包含PTX,那么您是正确的。如果没有,我是正确的。由于“无效设备功能”错误是一个非常明确的迹象,表明在构建的图像中不存在合适的PTX,我倾向于相信我是正确的,并与您自己的声明一致:“我在网上找到的所有内容这是由GPU的计算能力与CUDA_ARCH_BIN设置之间的不匹配造成的“ –

感谢@RobertCrovella提供正确的答案。只需在CMAKE的CUDA_ARCH_BIN列表中添加6.1即可解决问题。所以我最终使用的是 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变得越大。这正好支持罗伯特在评论中所说的话。看起来,对于列表中的每个体系结构,该体系结构的特定代码都会添加到dll中。如果您没有在列表中放置拱门,代码将无法在该拱门上运行。

现在一切似乎都很明显。

再次感谢罗伯特!

对于那些有兴趣,这里是我的cmake CUDA设置:

enter image description here