Ошибка CMake: переменные установлены в NOTFOUND

Сначала я установил cuda, используя cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb. Теперь я пытаюсь установить OpenCV 3.3.0 Но я получаю ошибку 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)

И вот очень длинный список целей вроде:

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? Что не так?

Ответ 1

Я пробовал следующее и работал:

Измените FindCUDA.cmake библиотеку nppi на несколько разделенных. Это нужно сделать в 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 превратится в if if.

Последнее, что нужно. Теперь у CUDA 9.0 есть выделенный файл для halffloat (cuda_fp16.h). Это должно быть включено в OpenCV.

Из руководства CUDA 9.0:

Неподдерживаемые функции Генеральный CUDA ‣ Библиотека CUDA. Были удалены встроенные функции __float2half_rn() и __half2float(). Используйте эквивалентную функциональность в обновленном файле заголовка fp16 из инструментария CUDA.

Для этого вам нужно добавить:

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

Для других людей с окнами и visual studio 7 мне также пришлось изменить переменную CUDA_HOST_COMPILER, иначе вы получите кучу ошибок с cmd.exe exit with code 1 или что-то подобное... похоже, автоопределяемый.

Это работало для меня с OpenCV 3.3 и CUDA 9.0 и Visual Studio 2017 с Windows 10. Я думаю, что это должно работать и в Ubuntu, так как ошибка и изменения связаны с CUDA. Я не тестировал это много, я скомпилировал и запустил некоторые тесты производительности, и все они прошли... Поэтому я думаю, что все работает нормально.

Ответ 2

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

Это сработало для меня.

Ответ 3

Мне также пришлось сделать следующее в 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()

Ответ 4

Решение

@api55 решает ошибки, связанные с CUDA_nppi_LIBRARY. Так что просто следуйте шагам, и это работает (для меня на Ubuntu 16.04 с opencv 3.3). Убедитесь, что ваша архитектура GPU поддерживается. У меня Fermi, который больше не поддерживается. Решение заключается в установке Cuda-8 с компилятором gcc-5 при установке opencv 3.3 с поддержкой cuda. ​​

Ответ 5

Те же изменения работают для "OpenCV-2.14.13.5" с CUDA-9.0 на Ubuntu 16.04. Я следил за изменениями, предложенными @api55 и @Mudassir Khan.