使用CUDA支持构建OpenCV

时间:2015-01-18 13:50:02

标签: opencv cuda

我使用CMake生成visual studio 2013解决方案。接下来我尝试构建它,但得到以下错误:

  

构建NVCC(设备)对象模块/ 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 个答案:

答案 0 :(得分:20)

另一种选择。 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  .. 

我也应用了patch, 但我不确定是否最终需要它。我曾尝试使用和不使用CUDA_GENERATION=Maxwell,但麦克斯韦未被检测到。我没有在补丁之前尝试CUDA_GENERATION=Auto,这就是为什么我不确定。

答案 1 :(得分:13)

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

答案 2 :(得分:10)

跟进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。)

答案 3 :(得分:6)

您可以使用CUDA_GENERATION为GPU架构指定相应的代码名称。

以下是解析CUDA_GENERATION值的相关opencv cmake code

  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

例如,我的middling-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)仍有open issue in the opencv tracker关于自动检测不正常的情况。

答案 4 :(得分:4)

谢谢,

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

这让我安装opencv-2.4.9。

如果您想了解更多详细信息,请查看link

答案 5 :(得分:3)

这是因为你的gpu类型不匹配。

您必须明确定义CUDA_GENERATION。

在我身边,我可以找到3种类型的CUDA_GENERATION; Auto,Kepler,Fermi。

当我将CUDA_GENERATION设置为Kepler时,compute_11更改为compute_30并构建成功。

答案 6 :(得分:2)

您应该使用cmake这些条目CUDA_ARCH_BIN = 3.2CUDA_ARCH_PTX = 3.2

进行设置

希望它有所帮助。

此致

答案 7 :(得分:1)

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 ..

worked for me for OpenCV 2.4.11