versiones Construye OpenCV con soporte CUDA




release opencv (7)

Estoy usando CMake para generar la solución visual studio 2013. A continuación, intento construirlo, pero sigue el error:

Creación de módulos de objeto NVCC (Dispositivo) / core / CMakeFiles / cuda_compile.dir / src / cuda / Debug / cuda_compile_generated_gpu_mat.cu.obj

nvcc fatal: arquitectura gpu no compatible 'compute_11'

Estoy probando las versiones 2.10 y 3.0 con cuda 6.5 y 7.0. CUDA_ARCH_BIN establecido en: 1.1 1.2 1.3 2.0 2.1 (2.0) 3.0 3.5


Puede usar CUDA_GENERATION para especificar el nombre de código de generación correspondiente para su arquitectura de GPU.

Aquí está el código relevante de cmake que analiza el valor 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()

Y la página CUDA de wikipedia tiene una buena tabla para asignar su tarjeta de video al nombre correcto del código de microarquitectura (lo siento, es demasiado grande para reproducirse aquí):

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

Por ejemplo, mi MacBook Pro de middling-2012 tiene una GeForce GT 650M antigua, que la tabla de wikipedia indica utiliza la microarquitectura Kepler. Por lo tanto, uso esto en mi línea de comando cmake:

cmake -D CUDA_GENERATION="Kepler" ...

y el script opencv lo convierte a "3.0 3.5 3.7" cuando muestra el resumen de configuración, y pasa los indicadores correspondientes a nvcc .

En mi caso, antes de configurar esto correctamente, recibía errores sobre compute_70 no admitido. Al parecer, todavía hay un problema abierto en el rastreador de opencv a partir de hoy (2017-10-07) sobre la autodetección que no funciona correctamente.


Debe establecer con cmake estas entradas CUDA_ARCH_BIN = 3.2 y CUDA_ARCH_PTX = 3.2

Espero eso ayude.

Saludos


Siguiendo con la respuesta de Yun (no podía dejar comentario), esto funcionó para mí y muestra un posible valor para CUDA_GENERATION :

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

(Ubuntu 12.04 y 14.04, GTX Titan y OpenCV 2.4.11 y 3.0.0.)


Gracias,

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

Esto me permite instalar opencv-2.4.9.

Si quieres saber más detalles visita este link .


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

trabajó para mí para OpenCV 2.4.11


Otra opción. 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  .. 

También apliqué el patch , pero no estoy seguro de si fue necesario. Lo intenté con y sin CUDA_GENERATION=Maxwell pero Maxwell no se detecta. No probé CUDA_GENERATION=Auto antes del parche, por eso no estoy seguro.


Esto se debe a que tu tipo gpu no coincide.

Tienes que definir CUDA_GENERATION explícitamente.

En mi lado, pude encontrar 3 tipos de CUDA_GENERATION; Auto, Kepler, Fermi.

Cuando configuro CUDA_GENERATION como Kepler, compute_11 cambió a compute_30 y se construyó correctamente.





cuda