2017-10-05 97 views
10

Zainstalowałem cuda najpierw używając cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb. Teraz próbuję zainstalować OpenCV 3.3.0 ale jestem coraz CUpewnij błąd:Błąd CMake: Zmienne są ustawione na NOTFOUND

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) 

A potem bardzo długą listę celów tak:

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

używam tego polecenia do kompilacji biblioteka:

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

Jak ustawić moje CMakeLists? Co idzie źle?

+0

OpenCV nie jest aktualizowany do cuda 9 ... który był wydany jak tydzień temu. W cuda 9 rozdzielili tę bibliotekę na mniejsze. Niektórzy tworzą bibliotekę [zawierającą wszystkie mniejsze] (https://stackoverflow.com/questions/45525377/installing-opencv-3-3-0-with-contrib-modules-using-cmake-cuda-9 -0-rc-and-visual). [Tutaj] (https://devtalk.nvidia.com/default/topic/1024631/cmake-cuda-9-project-configurations-fails-cuda_nppi_library-is-not-available-/) ktoś próbuje zmodyfikować pliki cmake, ale dostałem kolejny błąd związany z brakującą zmienną matematyczną. – api55

+1

Naprawiono również ukośnik w tym wierszu: '-D WITH_GTK = ON /' – Drop

+0

@ api55 więc co sugerujesz mi zainstalować, które wersje opencv i cuda zainstalować, a które do najpierw zainstalować? Używam Ubuntu 16.04 –

Odpowiedz

23

Próbowałem następujące i to działało:

Zmiana FindCUDA.cmakenppi biblioteki do kilku z nich podzielony. To musi być zrobione w 3 miejscach. Pamiętaj, że ta zmiana ma na celu sprawienie, by działała z CUDA 9.0, nie robię czeków dla wersji lub czegokolwiek, co powinno być zrobione, jeśli planujesz dać to różnym osobom z różnymi wersjami CUDA.

1) spojrzeć na linii z:

find_cuda_helper_libs(nppi) 

i zastąpić go z linii:

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) znajdź linię:

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

i zmienić go na

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) znaleźć zmienne wyłączony i dodawać nowe zmienne, jak również więc znaleźć:

unset(CUDA_nppi_LIBRARY CACHE) 

i zmień ją na:

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) 

a także w OpenCVDetectCUDA.cmake trzeba wyjąć 2.0 architechture, która nie jest już obsługiwana.

Posiada:

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

Powinno być:

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

Zasadniczo usunąłem pierwszą jeśli i pierwszy Elif zamienia się if.

Ostatnia rzecz, jaka jest potrzebna. CUDA 9.0 ma teraz oddzielny plik dla halffloat (cuda_fp16.h). To musi być zawarte w OpenCV.

Z CUDA 9.0 Instrukcja:

Unsupported Features General CUDA ‣ CUDA library. The built-in functions __float2half_rn() and __half2float() have been removed. Use equivalent functionality in the updated fp16 header file from the CUDA toolkit.

Aby to zrobić, trzeba dodać:

#include <cuda_fp16.h> 

w pliku nagłówkowym

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

To są podstawy do określonej poprawki dla OpenCV. Czego mu brakuje, jak już ci mówiłem, nie interesują mnie wersje CUDA (wymaga IF). Ponadto CUDA 9.0 ma kilka przestarzałych funkcji używanych przez OpenCV ... prawdopodobnie zostanie to w pewnym momencie zastąpione przez zespół OpenCV. Możliwe jest również, że jedna lub więcej z rozdzielonych bibliotek nppi nie jest używana.

Zalecenia końcowe: Dla tego rodzaju skomplikowanych cmakes z tak wielu opcji należy użyć ccmake (sudo apt-get install cmake-curses-gui), aby móc łatwo zmienić zmienne lub przynajmniej zobaczyć wartości, albo jeden prawdziwy GUI.

Dla innych osób z oknami i studio graficznym 7, musiałem również zmienić zmienną CUDA_HOST_COMPILER, inaczej dostaniesz mnóstwo błędów z cmd.exe exit with code 1 lub coś podobnego ... wygląda na to, że nie może się tam dostać z autodetekcją .

To działało dla mnie z OpenCV 3.3 i CUDA 9.0 oraz Visual Studio 2017 z Windows 10. Myślę, że powinien działać również w systemie Ubuntu, ponieważ błąd i zmiany są związane z CUDA. Nie testowałem tego zbyt wiele, skompilowałem i przeprowadziłem niektóre testy wydajności i wszystkie przeszły ... Myślę, że wszystko działało dobrze.

+2

Mam do czynienia z błędem związanym z architekturą gpu. Próbuję to rozwiązać. Mówi: nvcc śmiertelne: nieobsługiwany architektura GPU 'compute_20' CUpewnij Błąd w cuda_compile_generated_gpu_mat.cu.o.cmake: 208 (komunikat): Błąd generowania /home/jjros/opencv-3.3.0/build/modules/ core/CMakeFiles/cuda_compile.dir/src/cuda /./ cuda_compile_generated_gpu_mat.cu.o –

+0

@Ja_cpp, która również znajduje się w odpowiedzi, ale prawdopodobnie zmienna nigdy nie jest unsetowana/resetowana, możesz usunąć folder kompilacji i zacząć od nowa, lub możesz ustawić zmienną usuwanie 2.0 z cuda_arch_bin, ponieważ architektura Fermi nie jest już obsługiwana w CUDA 9.0 – api55

+0

Naprawdę bardzo pomocna. Dzięki za szczegółowy przewodnik. Powinieneś go gdzieś blogować. – Jerry

0

@ rozwiązanie api55 rozwiązuje błędy związane z CUDA_nppi_LIBRARY. Po prostu postępuj zgodnie z instrukcjami i działa (dla mnie na Ubuntu 16.04 z opencv 3.3). Upewnij się, że twoja architektura GPU jest obsługiwana. Mam już Fermi, który nie jest już obsługiwany. Rozwiązaniem jest instalacja Cuda-8 z kompilatorem gcc-5 podczas instalowania opencv 3.3 z obsługą cuda.

3

@ api55 I na podstawie tego procesu może być zakończona, ale nadal występują problemy @Ja_cpp (CUpewnij błąd w cuda_compile_generated_gpu_mat.cu.o.cmake: 208 (komunikat)), w moim procesie, ale też trzeba dodać

w

OpenCVDetectCUDA.cmake

posiada:

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

zmiana:

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

To zadziałało dla mnie.

+0

Tęskniłem za tym, dobrze wiedzieć :) – api55

2

miałem też wykonać następujące czynności w OpenCVDetectCUDA.cmake:

zastąpić

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

z

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

Te same zmiany pracy dla "OpenCV-2.14.13.5" z CUDA -9.0 na Ubuntu 16.04. Śledziłem zmiany sugerowane przez @ api55 i @Mudassir Khan.