首页 文章

第一次cuda呼叫中的OpenCV Cuda“无效设备功能”

提问于
浏览
0

我已经成功地使用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之间可能存在不兼容性?任何想法将不胜感激 .

1 回答

  • 1

    感谢@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中 . 如果您没有在列表中放置拱门,则代码将不会在该拱门上运行 .

    现在这一切似乎都很明显 .

    再次感谢,罗伯特!

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

    enter image description here

相关问题