在 CUDA 支持下构建 OpenCV



我使用 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 2.10 和 3.0 和 3.0 版本 6.5 和 7.0。CUDA_ARCH_BIN设置为:1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5

另一种选择。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但麦克斯韦没有被发现。在补丁之前我没有尝试CUDA_GENERATION=Auto,这就是为什么我不确定的原因。

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

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

您可以使用

CUDA_GENERATION为 GPU 架构指定相应的生成代码名称。

以下是解析CUDA_GENERATION值的相关 opencv cmake 代码:

  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,维基百科表格表明它使用了开普勒微架构。因此,我在我的 cmake 命令行中使用它:

cmake -D CUDA_GENERATION="Kepler" ...

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

就我而言,在正确设置之前,我收到有关compute_70不支持的错误。显然,截至今天(2017-10-07),opencv跟踪器中仍然存在一个关于自动检测无法正常工作的未决问题。

谢谢,

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

这让我安装了opencv-2.4.9。

如果您想了解更多细节,请查看此链接。

这是因为

您的 GPU 类型不匹配。

您必须明确定义CUDA_GENERATION。

在我这边,我可以找到 3 种类型的CUDA_GENERATION;奥托、开普勒、费米。

当我CUDA_GENERATION设置为开普勒时,compute_11改为compute_30和成功构建。

您应该将这些条目cmake设置为CUDA_ARCH_BIN = 3.2CUDA_ARCH_PTX = 3.2

希望对您有所帮助。

问候

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

为我工作 OpenCV 2.4.11

最新更新