Construire OpenCV avec le soutien de CUDA

J'utilise CMake pour générer la solution visual studio 2013. Prochaine im essayer de le construire, mais se suivre d'erreur:

construction de modules d'objets NVCC (Device)/core/CMakeFiles/cuda_compile.dir / src/cuda/Debug / cuda_compile_generated_gpu_mat.cu.obj

nvcc fatale : non pris en charge architecture gpu 'compute_11'

Im essayer les versions 2.10 et 3.0 avec cuda 6.5 et 7.0. Cuda_arch_bin réglé à : 1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5

19
demandé sur Anatoly 2015-01-18 16:50:01

8 réponses

une autre option. 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  .. 

j'ai aussi appliqué le patch, mais je ne suis pas sûr qu'il a fini par être nécessaire. J'avais essayé avec et sansCUDA_GENERATION=Maxwell mais Maxwell n'est pas détecté. Je n'ai pas essayer CUDA_GENERATION=Auto avant le patch, c'est pourquoi je ne suis pas sûr.

19
répondu user1269942 2016-07-07 20:28:52

lorsque vous utilisez cmake pour faire des configurations, définissez l'option CUDA_GENERATION pour préciser votre architecture GPU. J'ai rencontré la même erreur et j'ai essayé de résoudre le problème.

13
répondu Yun Zhao 2015-02-23 08:13:46

suite à la réponse de Yun( ne pouvait pas laisser de commentaire), cela a fonctionné pour moi et montre une valeur possible pour CUDA_GENERATION:

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

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

10
répondu Ulrich Stern 2015-08-19 15:04:12

Merci,

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

ceci me permet d'installer opencv-2.4.9.

si vous voulez en savoir plus, cochez cette case lien.

4
répondu itp 2016-07-07 21:28:04

Vous pouvez utiliser CUDA_GENERATION pour spécifier le nom de code de génération correspondant pour votre architecture GPU.

Voici le opencv cmake code qui analyse l' CUDA_GENERATION valeur:

  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()

et la page wikipedia CUDA a une belle table pour mapper votre carte vidéo au bon nom de code de microarchitecture (désolé, il est trop grand pour reproduire ici):

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

par exemple, my middling-2012 Macbook Pro a une GeForce GT 650M antique, que la table wikipedia indique utilise la microarchitecture Kepler. Par conséquent, j'utilise ceci dans ma ligne de commande cmake:

cmake -D CUDA_GENERATION="Kepler" ...

et le script opencv convertit cela en "3.0 3.5 3.7" quand il affiche le résumé de configuration, et transmet les options correspondantes à nvcc.

dans mon cas, avant de régler cela correctement, j'ai eu des erreurs à propos de compute_70 pas pris en charge. Apparemment, il y a toujours un question ouverte dans le opencv tracker à partir d'aujourd'hui (2017-10-07) sur l'auto-détection ne fonctionne pas correctement.

4
répondu rob3c 2017-10-08 03:27:09

c'est à cause de votre type gpu qui ne correspond pas.

vous devez définir CUDA_GENERATION explicitement.

dans mon côté, je pourrais trouver 3 types de CUDA_GENERATION; Auto, Kepler, Fermi.

quand J'ai défini CUDA_GENERATION comme Kepler, compute_11 a changé pour compute_30 et construire avec succès.

3
répondu PhonPanom 2015-09-02 05:55:35

vous devriez définir avec cmake ces entrées CUDA_ARCH_BIN = 3.2 et CUDA_ARCH_PTX = 3.2

j'Espère que ça aide.

Cordialement

2
répondu Francisco 2015-06-30 16:58:10

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

a travaillé pour moi pour OpenCV 2.4.11

1
répondu WillC 2016-02-03 03:05:11