web-dev-qa-db-fra.com

Construisez OpenCV avec le support CUDA

J'utilise CMake pour générer une solution Visual Studio 2013. Ensuite, essayez de le construire, mais obtenez l'erreur de suivi:

Création de modules d'objet NVCC (périphérique)/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj

nvcc fatal: architecture gpu non prise en charge 'compute_11'

J'essaie la version 2.10 et 3.0 avec cuda 6.5 et 7.0. CUDA_Arch_BIN défini sur: 1,1 1,2 1,3 2,0 2,1 (2,0) 3,0 3,5

20
Anatoly

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 également appliqué le patch , mais je ne sais pas s'il a finalement été nécessaire. J'avais essayé avec et sansCUDA_GENERATION=Maxwell mais Maxwell n'est pas détecté. Je n'ai pas essayé CUDA_GENERATION=Auto avant le patch, c'est pourquoi je n'en suis pas sûr.

21
user1269942

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

13
Yun Zhao

Suite à la réponse de Yun (n'a pas pu 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
Ulrich Stern

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

Voici le code opencv cmake qui analyse le 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 un joli tableau pour mapper votre carte vidéo au bon nom de code de microarchitecture (désolé, il est trop grand pour être reproduit ici):

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

Par exemple, mon Macbook Pro 2012 est doté d'une GeForce GT 650M antique, qui, selon le tableau de Wikipédia, 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 le convertit en "3.0 3.5 3.7" lorsqu'il affiche le résumé de la configuration et transmet les drapeaux correspondants à nvcc.

Dans mon cas, avant de régler cela correctement, je recevais des erreurs sur compute_70 non supporté. Apparemment, il y a toujours un problème ouvert dans le tracker opencv à ce jour (2017-10-07) sur la détection automatique qui ne fonctionne pas correctement.

6
rob3c

Je vous remercie,

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

Cela m'a permis d'installer opencv-2.4.9.

Si vous voulez en savoir plus, vérifiez ceci link .

4
itp

Cela est dû au fait que votre type de processeur graphique ne correspond pas.

Vous devez définir explicitement CUDA_GENERATION.

De mon côté, j'ai pu trouver 3 types de CUDA_GENERATION; Auto, Kepler, Fermi.

Lorsque j'ai défini CUDA_GENERATION comme Kepler, compute_11 est devenu compute_30 et la construction a réussi.

3
PhonPanom

Vous devez 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
Francisco

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
WillC