web-dev-qa-db-fra.com

Erreur CMake: les variables sont définies sur NOTFOUND

J'ai d'abord installé cuda en utilisant cuda-repo-ubuntu1604-9-0-local_9.0.176-1_AMD64.deb. Maintenant, j'essaie d'installer OpenCV 3.3.0 Mais je reçois une erreur CMake:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)

Et puis une très longue liste de cibles comme celle-ci:

linked by target "opencv_cudev" in directory /home/jjros/opencv-3.3.0/modules/cudev

J'utilise cette commande pour compiler la bibliothèque:

cmake 

-D CMAKE_C_COMPILER=/usr/bin/gcc-5 \ 
-D CMAKE_BUILD_TYPE=RELEASE \   
-D CMAKE_INSTALL_PREFIX=/usr/local \     
-D WITH_CUDA=ON \     
-D WITH_CUBLAS=ON \     
-D WITH_TBB=ON \    
-D WITH_V4L=ON \    
-D WITH_QT=ON \     
-D WITH_OPENGL=ON \    
-D ENABLE_FAST_MATH=1 \        
-D CUDA_FAST_MATH=1 \        
-D WITH_CUBLAS=1 \        
-D INSTALL_C_EXAMPLES=OFF \    
-D INSTALL_PYTHON_EXAMPLES=ON \        
-D BUILD_SHARED_LIBS=ON \        
-D WITH_GTK=ON \        
-D BUILD_EXAMPLES=ON \     
-D  CUDA_NVCC_FLAGS="-D_FORCE_INLINES" .. 

Comment définir mes CMakeLists? Qu'est-ce qui ne va pas?

16
Ja_cpp

J'ai essayé ce qui suit et cela a fonctionné:

Remplacez dans FindCUDA.cmake la bibliothèque nppi par plusieurs bibliothèques fractionnées. Cela doit être fait à 3 endroits. Rappelez-vous que cette modification a simplement pour but de faire fonctionner CUDA 9.0. Je ne vérifie pas la version ou quoi que ce soit, ce qui devrait être fait si vous prévoyez de le donner à différentes personnes avec différentes versions de CUDA.

1) cherchez la ligne avec:

find_cuda_helper_libs(nppi)

et le remplacer par les lignes:

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)

2) trouver la ligne:

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

et le changer en

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

3) recherchez les variables non définies et ajoutez également les nouvelles variablesAlors, trouvez:

unset(CUDA_nppi_LIBRARY CACHE)

et changez le en:

unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)

Et également dans OpenCVDetectCUDA.cmake, vous devez supprimer l'architecture 2.0 qui n'est plus prise en charge.

Il a:

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

CA devrait etre:

  ...
  set(__cuda_Arch_ptx "")
  if(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")
  ...

Fondamentalement, j'ai supprimé le premier if et le premier Elif se transforme en if.

Comme mentionné par @matko Il a également:

set(__cuda_Arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

Ce qui devrait être changé pour:

set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

Une dernière chose est nécessaire. CUDA 9.0 a maintenant un fichier séparé pour la demi-boucle (cuda_fp16.h). Cela doit être inclus dans OpenCV.

Du manuel CUDA 9.0:

Fonctions non prises en charge Général CUDA Library bibliothèque CUDA. Les fonctions intégrées __float2half_rn () et __half2float () ont été supprimées. Utilisez des fonctionnalités équivalentes dans le fichier d’en-tête fp16 mis à jour de la boîte à outils CUDA.

Pour ce faire, vous devez ajouter:

#include <cuda_fp16.h>

dans le fichier d'en-tête

opencv-3.3.0\modules\cudev\include\opencv2\cudev\common.hpp

Ce sont les bases pour un correctif définitif pour OpenCV. Ce qui manque, comme je vous l'ai déjà dit, je me moque des versions de CUDA (il faut un IF). De plus, CUDA 9.0 contient un tas de fonctions dépréciées utilisées par OpenCV ... qui seront probablement remplacées par l’équipe OpenCV à un moment donné. Il est également possible qu’une ou plusieurs des bibliothèques divisées de nppi ne soient pas utilisées.

Recommandations finales: Pour ce type de cmakes complexes avec tant d’options, vous devez utiliser ccmake (Sudo apt-get install cmake-curses-gui) pour pouvoir modifier facilement les variables ou au moins afficher les valeurs, ou une interface graphique réelle.

Pour les autres utilisateurs de Windows et de Visual Studio 7, je devais également modifier la variable CUDA_Host_COMPILER. Sinon, vous obtiendrez de nombreuses erreurs avec cmd.exe exit with code 1 ou quelque chose de similaire.

Cela a fonctionné pour moi avec OpenCV 3.3, CUDA 9.0 et Visual Studio 2017 avec Windows 10. Je pense que cela devrait également fonctionner dans Ubuntu, car l'erreur et les modifications sont liées à CUDA. Je ne l'ai pas beaucoup testé, j'ai compilé et exécuté quelques-uns des tests de performance et ils ont tous réussi ... Je pense donc que tout a bien fonctionné.

41
api55

@ api55 I basé sur ce processus peut être terminé mais le problème @Ja_cpp (erreur CMake sur cuda_compile_generated_gpu_mat.co.o.cmake: 208 (message)) persiste, mais je dois également ajouter 

dans 

OpenCVDetectCUDA.cmake

Il a:

set(__cuda_Arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

changer à:

set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")

Cela a fonctionné pour moi.

4
max ko

Remplacer FindCUDA.cmake et OpenCVDetectCUDA.cmake à partir de https://github.com/opencv/opencv/tree/master/cmake (branche principale - opencv 3.4.1) fonctionne pour moi pour opencv_2.4.13 avec la carte graphique NVIDIA TitanXP de Pascal Architecture et avec cuda-9.0 sous Ubuntu 16.04.

3

J'ai également dû faire ce qui suit dans OpenCVDetectCUDA.cmake:

remplacer 

    if(${CUDA_VERSION} VERSION_LESS "8.0")
       set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2")
     else()
       set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
     endif()

avec 

    if(${CUDA_VERSION} VERSION_LESS "8.0")
      set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2")    
      set(CUDA_Arch_BIN "3.0 3.5 3.7 5.0 5.2")
    else()
      set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
      set(CUDA_Arch_BIN "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
    endif()
2
Mudassir Khan

La solution @ api55 résout les erreurs liées à CUDA_nppi_LIBRARY. Alors suivez simplement les étapes et ça marche (pour moi sur Ubuntu 16.04 avec opencv 3.3) . Assurez-vous que votre architecture GPU est supportée J'ai Fermi qui n'est plus supporté. La solution consiste à installer Cuda-8 avec le compilateur gcc-5 lors de l'installation de opencv 3.3 avec le support cuda.

0
Ja_cpp

J'ai essayé comme l'a dit api555, mais quand il a construit Sm20, j'ai fait un peu plus, de deux manières: 

1.dans le fichier OpenCVDetectCUDA.cmake, ligne 133, dans la boucle "foreach(Arch IN LISTS Arch_LIST)" , add "elseif(Arch MATCHES "20")" entre if et else. 

2. dans le fichier OpenCVDetectCUDA.cmake, ligne 46, "set(_generations "Fermi" "kepler" "Maxwell" "Pascal")" supprimez simplement le "Fermi" 

Je préfère la deuxième façon, qu'elle aide un peu.

0
Allen Chan

Remplacez l'opencv existant par la dernière version, cela fonctionne bien. XD

0
Rakshith Reddy