使用CUDA 9.0RC编译OpenCV 3.3

时间:2017-08-28 11:58:38

标签: c++ visual-studio opencv cmake cuda

我目前正在尝试使用CUDA 9.0RC编译OpenCV 3.3,但无法完成所有工作。 (在Windows上编译,使用CMake 3.9和Visual Studio 2017,适用于x64 Windows)

首先,如果我尝试在没有CUDA的情况下编译OpenCV,一切正常。

之后,我添加了" WITH CUDA" CMake中的选项,包含所有正确的路径,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

我不知道这个" bin"是来自,我真的不知道我应该做些什么才能让它发挥作用..

谢谢你的回复!

2 个答案:

答案 0 :(得分:9)

错误是因为主机编译器的路径错误。它在CMake中指定为CUDA_HOST_COMPILER$(VCInstallDir)/bin。由于这是文件夹的路径(实际上它是一个非现有文件夹),而不是exe,因此构建失败。

这可能是因为MSVC 2017有一条新的,更复杂的bin文件夹路径。它曾经是:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

新路径是这样的,并且会根据您拥有的MSVC版本而有所不同:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64

更多信息here。这个变化有一个很好的逻辑论据,但它可能打破了大量尚未更新的构建脚本。

您可以通过将变量设置为强制来强制它,例如:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64\cl.exe

您可能会收到目标操作系统不受支持的错误(即使它应该与CUDA 9一起使用)。

7>nvcc fatal : Host compiler targets unsupported OS.

这有两个fixes

1)如果你有最新的MSVC 2017,你需要诱骗CUDA接受它,因为它的版本是1911,而不是1910年。

打开C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include\crt\host_config.h并找到以下行:

#if _MSC_VER < 1600 || _MSC_VER > 1910

1910更改为1911

2)在CMake中,将--cl-version=2017添加到CUDA_NVCC_FLAGS。我不确定是否需要,但它不会受到伤害。

这对我来说似乎已经成功了。您可能还需要禁用性能测试。您还会发现ncuvid.h目前还不存在,无论是否改变位置我都不知道。这可以防止构建opencv_cudacodec,但我怀疑这对大多数人来说不是问题。

答案 1 :(得分:0)

我不得不做几件事来获得VS 2017 + Cuda 9.0 + OpenCV 3.3.0 + CMake 3.10.0-rc2:

  1. 根据此处的说明修改\ cmake \ FindCuda.cmake:
  2. https://devtalk.nvidia.com/default/topic/1024631/cuda-9-opencv-gt-building-errors/

    基本上,您必须在Cuda 9中添加较新的npp库...请记住遵循这些说明时,nppic需要阅读nppicc。

    1. 修改saturate_cast.hpp以使用cuda 9处理__half中的更改,也在该文档中。

    2. 运行cmake,并确保: 一个。 WITH_CUBLAS已被选中 湾CUDA_NVCC_FLAGS设置为“--cl-version = 2017” C。 CUDA_HOST_COMPILER设置为系统“cl.exe”所在的位置。    (可能是c:\ program files(x86)\ Microsoft Visual Studio \ 2017 \ enterprise ...“    (不要忘记上面的行需要使用FORWARD斜杠,而不是向后!)

    3. 按配置,然后按生成

    4. 你会收到很多错误。我不知道为什么,在Windows + Visual Studio中它们似乎是不可避免的。