2017-08-28 165 views
3

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

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

在那之后,我加入C进行“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 

想这是一个“牌坊”的问题,我试着改变,在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 

我不知道这个“箱子”是由正在添加的,我真的不知道我应该怎样做才能使其发挥作用。 。

感谢您的回复!

+1

在CUDA 9.0辗转在计算能力2.x的支持,之后是在CUDA 8.0中不推荐使用,这是您的第一个错误。如果您从架构列表中删除“2.0”来构建?会发生什么情况?您应该b通过研究CMAKE(一个功能强大的混淆工具)的输出,能够找出“bin”来自哪里:推测它是不正确构建的路径的一部分,因此被视为可执行文件的调用。 – njuffa

+0

从ARCH Build中移除2.0可以解决第一个错误,但是后来给了我第二个错误。我已经设法将这个错误视为weel(这确实是一个路径问题),但现在当我试图编译OpenCV时,它抱怨“__half2float()”没有声明..我尽我所能,但不能找到答案... – TmZn

回答

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

您可能会得到一个错误目标OS不支持(即使它应该与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

变化19101911

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

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

+0

我发现我必须在cl.exe的路径上使用正斜杠。想知道为什么它有所作为 –

+0

@ericfrazer我想这是Windows中转义序列的常见问题。双反斜杠也应该起作用。 – Josh

0

我不得不做几件事情让VS 2017年+ 9.0 Cuda的OpenCV的+ 3.3.0 + CMake的3.10.0-RC2:

  1. 修改\ cmake的\ FindCuda.cmake每这里说明:

https://devtalk.nvidia.com/default/topic/1024631/cuda-9-opencv-gt-building-errors/

基本上,你必须添加新的NPP库中Cuda的9 ...下面的指令时,nppic需要读取nppicc记住。

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

  2. 运行cmake,并确保: a。 b检查WITH_CUBLAS 。 CUDA_NVCC_FLAGS设置为“--cl-version = 2017” c。 CUDA_HOST_COMPILER设置为系统“cl.exe”所在的位置。 (可能为C:\ Program Files文件(x86)的\微软的Visual Studio \ 2017年\企业......” (别忘了上面的行需要使用正斜杠,而不是向后看)

  3. 出版社然后配置生成

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