Compiling OpenCV 3.3 with CUDA 9.0RC
Compiling OpenCV 3.3 with CUDA 9.0RC
我目前正在尝试用CUDA 9.0RC编译OpenCV 3.3,但无法使其全部工作。(在Windows上编译,使用CMake 3.9和Visual Studio 2017,适用于x64 Windows)
首先,如果我尝试在没有CUDA的情况下编译OpenCV,一切都很好。
之后,我在CMake中添加了"WITH CUDA"选项,并添加了所有正确的路径,Visual Studio给了我这个错误:
9>------ Build started: Project: opencv_world, Configuration: Release x64 ------
9>Building NVCC (Device) object modules/world/CMakeFiles/cuda_compile.dir/__/core/src/cuda/Release/cuda_compile_generated_gpu_mat.cu.obj
9>nvcc fatal : Unsupported gpu architecture 'compute_20'
9>CMake Error at cuda_compile_generated_gpu_mat.cu.obj.cmake:206 (message):
9> Error generating
9> C:/OpenCV-3.3.0/opencv-3.3.0/build/modules/world/CMakeFiles/cuda_compile.dir/__/core/src/cuda/Release/cuda_compile_generated_gpu_mat.cu.obj
认为这是一个"ARCH"问题,我试图改变,在CMake:
CUDA_ARCH_BIN : 2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1
至:
CUDA_ARCH_BIN : 6.0 6.1
(因为我使用的是1080)
Visual Studio现在给我这个错误:
6>------ Build started: Project: opencv_world, Configuration: Release x64 ------
6>Building NVCC (Device) object modules/world/CMakeFiles/cuda_compile.dir/__/core/src/cuda/Release/cuda_compile_generated_gpu_mat.cu.obj
6>gpu_mat.cu
6>'bin' is not recognized as an internal or external command,
6>operable program or batch file.
6>CMake Error at cuda_compile_generated_gpu_mat.cu.obj.cmake:206 (message):
6> Error generating
6> C:/OpenCV-3.3.0/opencv-3.3.0/build/modules/world/CMakeFiles/cuda_compile.dir/__/core/src/cuda/Release/cuda_compile_generated_gpu_mat.cu.obj
我不知道这个"垃圾桶"是从哪里来的,我真的不知道该怎么做才能让它工作。。
谢谢你的回复!
错误是因为主机编译器的路径错误。它在CMake中指定为CUDA_HOST_COMPILER
:$(VCInstallDir)/bin
。由于这是一个文件夹的路径(事实上它是一个不存在的文件夹),而不是exe,因此构建失败。
这可能是因为MSVC 2017有一个新的、更复杂的bin
文件夹路径。它曾经是:
C:Program Files (x86)Microsoft Visual Studio 14.0VCbin
新的路径是这样的,并且会根据您拥有的MSVC版本而有所不同:
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503binHostX64x64
点击此处了解更多信息。这一变化有一个很好的逻辑论据,但它可能破坏了大量尚未更新的构建脚本。
您可以通过将变量设置为(例如:)来强制执行
C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503binHostX64x64cl.exe
您可能会收到不支持目标操作系统的错误(即使它应该与CUDA 9一起使用)。
7>nvcc fatal : Host compiler targets unsupported OS.
对此有两种修复方法。
1) 如果你有最新的MSVC 2017,你需要欺骗CUDA接受它,因为它是1911版,而不是1910版。
打开C:Program FilesNVIDIA GPU Computing ToolkitCUDAv9.0includecrthost_config.h
,找到这行:
#if _MSC_VER < 1600 || _MSC_VER > 1910
将1910
更改为1911
。
2) 在CMake中,将--cl-version=2017
添加到CUDA_NVCC_FLAGS
。我不确定是否需要,但不会有什么坏处。
这对我来说似乎已经成功了。你可能还需要禁用性能测试。你也会发现ncuvid.h
目前并不存在,我不知道它是否改变了位置。这阻止了构建opencv_cudacodec
,但我怀疑这对大多数人来说不是问题。
我必须做几件事才能获得VS 2017+Cuda 9.0+OpenCV 3.3.0+CMake 3.10.0-rc2:
- 按照此处的说明修改\cmake\FindCuda.cmake:
https://devtalk.nvidia.com/default/topic/1024631/cuda-9-opencv-gt-building-errors/
基本上,您必须在Cuda 9中添加更新的npp库…请记住,在遵循这些说明时,nppic需要阅读nppicc。
-
修改satellite_cast.hpp以处理__half中的更改,也在该文档中。
-
运行cmake,并确保:a.检查WITH_CUBLASb.CUDA_NVCC_FLAGS设置为"--cl版本=2017"c.CUDA_HOST_COMPLER设置为系统"cl.exe"所在的位置。(可能是c:\program files(x86)\Microsoft Visual Studio\2017\enterprise。。。"(别忘了上面的行需要使用FORWARD斜线,而不是倒斜线!)
-
按配置,然后生成
你会得到很多错误。我不知道为什么,它们在Windows+Visual Studio中似乎是不可避免的。
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- CUDA:统一内存和指针地址的更改
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 编译 CUDA 与数学函数的叮当
- 为什么 CUDA 不会导致C++代码加速?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- CUDA三角函数中的数学保证
- CUDA 使用共享内存平铺 3D 卷积实现
- CUDA:cudaMallocManage处理退出吗?
- Opencv 加速与 CUDA 在 C++.
- Cuda:具有位集数组的 XOR 单位集
- 用于构建 cuda .so 文件(共享库)的生成文件
- Compiling OpenCV 3.3 with CUDA 9.0RC