使用CUDA 9.0RC编译OpenCV 3.3

4
我目前正在尝试使用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

我不知道这个“bin”来自哪里,也不知道该怎么做才能使它工作。谢谢您的回复!

1
在CUDA 9.0中不再支持计算能力2.x,而在CUDA 8.0中被弃用,因此会出现第一个错误。如果您从要构建的架构列表中删除“2.0”,会发生什么?通过研究CMAKE的输出,您应该能够找出“bin”来自哪里(这是一个强大的混淆工具):可能它是构造路径时的一部分,因此被视为可执行文件的调用。 - njuffa
从ARCH Build中删除2.0可以解决第一个错误,但是随后出现了第二个错误。我已经成功地克服了这个错误(确实是路径问题),但是现在当我尝试编译OpenCV时,它抱怨“__half2float()”未声明...我已经尽力了,但是找不到答案... - TmZn
2个回答

10
错误是因为主机编译器的路径不正确。它在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,但我认为这对大多数人来说不是问题。


我发现在 cl.exe 的路径中必须使用正斜杠。不知道为什么这会有所不同。 - eric frazer
@ericfrazer 我想这是Windows转义序列的常见问题。双反斜杠也应该可以解决这个问题。 - Josh

0

我必须做几件事情才能让VS 2017 + Cuda 9.0 + 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/

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

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

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

  3. 按Configure然后Generate

您将会得到很多错误。我不知道为什么,在Windows + Visual Studio中似乎无法避免。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接