it-swarm.com.de

CMake-Fehler: Variablen sind auf NOTFOUND gesetzt

Ich habe cuda zuerst mit cuda-repo-ubuntu1604-9-0-local_9.0.176-1_AMD64.deb installiert. Jetzt versuche ich, OpenCV 3.3.0 zu installieren, aber ich bekomme einen CMake-Fehler:

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)

Und dann eine sehr lange Liste von Zielen wie folgt:

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

Ich verwende diesen Befehl zum Kompilieren der Bibliothek:

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

Wie kann ich meine CMakeLists einstellen? Was ist los?

16
Ja_cpp

Ich habe folgendes versucht und es hat funktioniert:

Ändern Sie in FindCUDA.cmake die nppi-Bibliothek in die mehreren aufgeteilten. Dies muss an 3 Stellen erfolgen. Denken Sie daran, dass diese Änderung nur mit CUDA 9.0 funktioniert. Ich überprüfe nicht die Version oder irgendetwas. Dies sollte geschehen, wenn Sie beabsichtigen, sie an verschiedene Personen mit unterschiedlichen CUDA-Versionen weiterzugeben.

1) suche die Zeile mit:

find_cuda_helper_libs(nppi)

und ersetze es mit den Zeilen:

  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) finde die Zeile:

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

und ändern Sie es in

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) Finde die nicht gesetzten Variablen und füge auch die neuen Variablen hinzuSo, finde:

unset(CUDA_nppi_LIBRARY CACHE)

und ändern Sie es in:

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)

Und auch in OpenCVDetectCUDA.cmake müssen Sie die 2.0-Architektur entfernen, die nicht mehr unterstützt wird.

Es hat:

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

Es sollte sein:

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

Grundsätzlich entfernte ich das erste if und das erste Elif wendet sich an ein if.

Wie von @matko .__ erwähnt. Es hat auch:

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

Welches sollte geändert werden in:

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

Ein letztes, was es braucht. CUDA 9.0 hat jetzt eine separate Datei für den Halffloat (cuda_fp16.h). Dies muss in OpenCV enthalten sein.

Ab CUDA 9.0 Handbuch:

Nicht unterstützte Funktionen Allgemeine CUDA ‣ CUDA-Bibliothek. Die eingebauten Funktionen __float2half_rn () und __half2float () wurden entfernt. Verwenden Sie entsprechende Funktionen in der aktualisierten fp16-Headerdatei aus dem CUDA-Toolkit.

Dazu müssen Sie Folgendes hinzufügen:

#include <cuda_fp16.h>

in der Headerdatei

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

Dies sind die Grundlagen für einen bestimmten Patch für OpenCV. Was es fehlt, gut, wie ich Ihnen schon sagte, ich interessiere mich nicht für CUDA-Versionen (es braucht eine IF). CUDA 9.0 enthält auch eine Reihe von veralteten Funktionen, die von OpenCV verwendet werden. Diese Funktion wird wahrscheinlich irgendwann vom OpenCV-Team ersetzt. Es ist auch möglich, dass eine oder mehrere der aufgeteilten Bibliotheken von nppi nicht verwendet wird.

Letzte Empfehlungen: Für diese Art von komplexen Optionen mit so vielen Optionen sollten Sie ccmake (Sudo apt-get install cmake-curses-gui) verwenden, um die Variablen leicht ändern oder zumindest die Werte anzeigen zu können oder eine echte GUI-Variable.

Für andere Leute mit Windows und Visual Studio 7 musste ich auch die CUDA_Host_COMPILER-Variable ändern, ansonsten gibt es eine Reihe von Fehlern mit cmd.exe exit with code 1 oder etwas Ähnlichem ... es scheint, dass es mit der automatisch erkannten nicht dorthin gekommen ist.

Dies funktionierte für mich mit OpenCV 3.3 und CUDA 9.0 und Visual Studio 2017 mit Windows 10. Ich denke, es sollte auch in Ubuntu funktionieren, da der Fehler und die Änderungen mit CUDA zusammenhängen. Ich habe es nicht viel getestet, ich habe einige der Leistungstests kompiliert und durchgeführt und alle bestanden ... Ich glaube, alles hat gut funktioniert.

41
api55

@ api55 Ich basierend auf diesem Prozess kann abgeschlossen werden, aber immer noch @Ja_cpp Problem (CMake-Fehler bei cuda_compile_generated_gpu_mat.cu.o.cmake: 208 (Nachricht)) in meinem Prozess, muss aber auch hinzufügen 

im 

OpenCVDetectCUDA.cmake

Es hat:

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

ändern:

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

Es hat für mich funktioniert.

4
max ko

FindCUDA.cmake und OpenCVDetectCUDA.cmake von https://github.com/opencv/opencv/tree/master/cmake (master branch-opencv 3.4.1) ersetzen, funktioniert für mich für opencv_2.4.13 mit NVIDIA TitanXP Grafikkarte von Pascal Architecture und mit cuda-9.0 unter Ubuntu 16.04.

3

Ich musste auch Folgendes in OpenCVDetectCUDA.cmake ausführen:

ersetzen 

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

mit 

    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

Die @ api55-Lösung behebt die Fehler in Bezug auf CUDA_nppi_LIBRARY. Folgen Sie einfach den Schritten und es funktioniert (für mich auf Ubuntu 16.04 mit opencv 3.3) . Stellen Sie sicher, dass Ihre GPU-Architektur unterstützt wird. Ich habe Fermi, das nicht mehr unterstützt wird. Die Lösung ist, Cuda-8 mit gcc-5 Compiler zu installieren, wenn Sie opencv 3.3 mit cuda-Unterstützung installieren.

0
Ja_cpp

Versucht, wie api555 sagte, aber als cmake auch sm20 baute, habe ich ein bisschen mehr gemacht, auf zwei Arten:

1.In der Datei OpenCVDetectCUDA.cmake, Zeile 133, fügen Sie in der Schleife "foreach(Arch IN LISTS Arch_LIST)" "elseif(Arch MATCHES "20")" zwischen if und else ein.

2.in der Datei OpenCVDetectCUDA.cmake, Zeile 46, "set(_generations "Fermi" "kepler" "Maxwell" "Pascal")" lösche einfach die "Fermi"

Ich bevorzuge den zweiten Weg, möge es ein wenig helfen.

0
Allen Chan

Ersetzen Sie das vorhandene opencv durch die neueste Version, es funktioniert einwandfrei. XD

0
Rakshith Reddy