使用CUDA构建支持OpenCV

21

我使用CMake生成Visual Studio 2013解决方案。接下来尝试构建它,但出现以下错误:

构建NVCC(设备)对象modules/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj

nvcc致命错误:不支持的GPU架构“compute_11”

我尝试了cuda 6.5和7.0版本的2.10和3.0版本。CUDA_ARCH_BIN设置为:1.1 1.2 1.3 2.0 2.1 (2.0) 3.0 3.5。

8个回答

23

另一个选项。 Ubuntu 14.04,GTX Titan X,opencv-2.4.10

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Auto -D BUILD_NEW_PYTHON_SUPPORT=ON  .. 

我也使用了补丁,但我不确定是否需要。我尝试过使用和不使用CUDA_GENERATION=Maxwell,但未检测到Maxwell。在应用补丁之前,我没有尝试过CUDA_GENERATION=Auto,所以我不确定。

为什么要构建TIFF? - user10024395
@user136266 因为我处理的一些数据是tiff格式的。这种格式在地理空间数据、栅格等方面很常见。 - user1269942

13

在使用cmake进行配置时,将选项CUDA_GENERATION设置为特定的GPU架构。我也遇到了同样的错误,并尝试使用此方法解决问题。


11

跟进Yun的回答(无法留言),这对我有用,并显示了可能的CUDA_GENERATION值:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

(Ubuntu 12.04和14.04,GTX Titan以及OpenCV 2.4.11和3.0.0。)


7
您可以使用 CUDA_GENERATION 来指定您的GPU架构对应的代号。
以下是相关的opencv cmake代码,用于解析 CUDA_GENERATION 值:
  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")
  elseif(CUDA_GENERATION STREQUAL "Pascal")
    set(__cuda_arch_bin "6.0 6.1")
  elseif(CUDA_GENERATION STREQUAL "Volta")
    set(__cuda_arch_bin "7.0")
  elseif(CUDA_GENERATION STREQUAL "Auto")
    execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" ${CUDA_NVCC_FLAGS} "${OpenCV_SOURCE_DIR}/cmake/checks/OpenCVDetectCudaArch.cu" "--run"
                     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
                     RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out
                     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(NOT _nvcc_res EQUAL 0)
      message(STATUS "Automatic detection of CUDA generation failed. Going to build for all known architectures.")
    else()
      set(__cuda_arch_bin "${_nvcc_out}")
      string(REPLACE "2.1" "2.1(2.0)" __cuda_arch_bin "${__cuda_arch_bin}")
    endif()
endif()

维基百科的CUDA页面有一个很好的表格,可以将您的视频卡映射到正确的微架构代码名称(抱歉,这里无法复制):

https://en.wikipedia.org/wiki/CUDA#GPUs_supported

例如,我的中档2012款Macbook Pro配备古董级别的GeForce GT 650M,维基百科表格显示它使用Kepler微架构。因此,在我的cmake命令行中使用以下内容:

cmake -D CUDA_GENERATION="Kepler" ...

opencv脚本会在显示配置摘要时将其转换为“3.0 3.5 3.7”,并将相应的标志传递给nvcc

在我的情况下,在正确设置之前,我会收到关于不支持compute_70的错误。显然,截至今天(2017年10月07日),opencv跟踪器中仍存在一个有关自动检测不能正常工作的未解决问题


4

谢谢您,

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

这让我安装了opencv-2.4.9。
如果您想了解更多细节,请查看链接

感谢您回答问题。然而,这只是一个链接式的回答;最好在您的回答中包含更详细的描述,并提供来自您所引用链接的信息。 - Sidney Gijzen

3

这是因为您的GPU类型不匹配。

您需要明确定义CUDA_GENERATION。

在我的端上,我可以找到3种CUDA_GENERATION类型:Auto、Kepler、Fermi。

当我将CUDA_GENERATION设置为Kepler时,compute_11变成了compute_30,并且构建成功。


2

你应该使用cmake设置这些条目:CUDA_ARCH_BIN = 3.2CUDA_ARCH_PTX = 3.2

希望对你有所帮助。

祝好。


1
执行以下命令可以在安装OpenCV 2.4.11时生效:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Kepler -D BUILD_NEW_PYTHON_SUPPORT=ON ..

对我来说有效果


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