Ответ 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. Я не тестировал это много, я скомпилировал и запустил некоторые тесты производительности, и все они прошли... Поэтому я думаю, что все работает нормально.