2017-10-05 315 views
10

我首先使用cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb安裝了cuda。現在,我試圖安裝OpenCV 3.3.0但我發現CMake的錯誤:CMake錯誤:變量設置爲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) 

然後目標像這樣一個很長的名單:

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

我使用這個命令編譯庫:

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

如何設置我的CMakeLists?出了什麼問題?

+0

OpenCV未更新爲cuda 9 ...這是一週前發佈的版本。在cuda 9中,他們將這個圖書館分成了更小的圖書館。有些人創建了一個庫[擁有所有較小的庫](https://stackoverflow.com/questions/45525377/installing-opencv-3-3-0-with-contrib-modules-using-cmake-cuda-9 -O-RC-和可視)。 [Here](https://devtalk.nvidia.com/default/topic/1024631/cmake-cuda-9-project-configurations-fails-cuda_nppi_library-is-not-available-/)有人試圖修改cmake文件,但得到了另一個相對於缺少數學變量的錯誤 – api55

+1

還修復了這一行上的斜線:'-D WITH_GTK = ON /' – Drop

+0

@ api55那麼你建議我安裝哪些版本的opencv和cuda來安裝以及哪一個先安裝?我使用的是Ubuntu 16.04 –

回答

23

我嘗試了以下內容和它的工作:

變化FindCUDA.cmakenppi庫的幾個分裂的。這必須在3個地方完成。請記住,此更改只是爲了使其適用於CUDA 9.0,而不是對版本或任何其他內容進行檢查,如果您計劃將其分發給具有不同CUDA版本的不同人員,則應該這樣做。

1)尋找與線:

find_cuda_helper_libs(nppi) 

和與所述線代替它:

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)找到行:

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

,並更改爲

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)發現未設置變量,並添加新的變量以及 因此,發現:

unset(CUDA_nppi_LIBRARY CACHE) 

並將其更改爲:

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) 

而且也OpenCVDetectCUDA.cmake您必須刪除2.0不再支持的建築。

它具有:

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

它應該是:

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

基本上我除去第一和如果所述第一elif的轉向如果一個。

它需要的最後一件事。 CUDA 9.0現在有一個用於halffloat的分離文件(cuda_fp16.h)。這需要包含在OpenCV中。

來自CUDA 9。0手冊:

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.

要做到這一點,你需要添加:

#include <cuda_fp16.h> 

在頭文件

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

這是針對OpenCV的一個明確的補丁的基本知識。它缺少什麼,就像我之前告訴過你的,我不關心CUDA版本(它需要一個IF)。此外,CUDA 9.0還有一堆被OpenCV使用的不推薦使用的函數......這可能會在某些時候被OpenCV團隊所取代。還有可能一個或多個nppi的拆分庫不被使用。

最終建議: 對於這種複雜的cmakes有這麼多的選擇,你應該使用ccmake(sudo apt-get install cmake-curses-gui)能夠輕鬆地更改變量或至少查看值,或者真正的GUI。

對於其他使用windows和visual studio 7的人,我也必須更改CUDA_HOST_COMPILER變量,否則你會得到一堆與cmd.exe exit with code 1或類似的錯誤...似乎無法通過自動檢測到的。

這適用於OpenCV 3.3和CUDA 9.0以及Windows 10的Visual Studio 2017。我認爲它也可以在Ubuntu中使用,因爲錯誤和更改與CUDA相關。我沒有測試太多,我編譯並運行了一些性能測試,並且所有的測試都通過了...所以我認爲一切正常。

+2

我面臨着與GPU架構相關的錯誤。我試圖解決它。它說: NVCC致命:不支持的GPU架構 'compute_20' 在cuda_compile_generated_gpu_mat.cu.o.cmake CMake的錯誤:208(消息): 錯誤產生 /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也在回答中,但可能變量永遠不會被設置/重置,您可以刪除構建文件夾並重新啓動,或者您可以從cuda_arch_bin中設置變量刪除2.0,因爲CUDA 9.0不再支持Fermi架構。 – api55

+0

真的很有幫助。感謝您的詳細指導。你應該在某處寫博客。 – Jerry

0

@ api55解決方案解決了與CUDA_nppi_LIBRARY相關的錯誤。所以只需按照步驟進行操作(對我而言,Ubuntu 16.04opencv 3.3)。 確保您的GPU架構得到支持。我已經不再支持Fermi。解決方案是安裝​​與gcc-5編譯器時安裝opencv 3.3與cuda支持。

3

@ api55我根據這個過程可以完成,但仍然遇到@Ja_cpp問題(CMake的錯誤在cuda_compile_generated_gpu_mat.cu.o.cmake:208(消息)),在我的過程中,還需要添加

OpenCVDetectCUDA.cmake

它具有:

set(__cuda_arch_bin "2.0 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") 

它爲我工作。

+0

我錯過了,很高興知道:) – api55

2

我也不得不做OpenCVDetectCUDA.cmake如下:

更換

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

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

同樣的變化爲 「OpenCV的-2.14.13.5」 與CUDA工作在Ubuntu 16.04上爲-9.0。我遵循@ api55和@Mudassir Khan提出的修改。