opencv cmake cuda ubuntu-16.04

opencv - Error de CMake: las variables se establecen en NOTFOUND



cuda ubuntu-16.04 (7)

Instalé cuda primero usando cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb . Ahora estoy tratando de instalar OpenCV 3.3.0 pero estoy recibiendo un error de 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)

Y luego una lista muy larga de objetivos como tal:

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

Estoy usando este comando para compilar la biblioteca:

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

¿Cómo puedo configurar mis CMakeLists? ¿Qué va mal?


@ api55 Se puede completar el proceso basado en este proceso pero aún encuentro el problema @Ja_cpp (Error de CMake en cuda_compile_generated_gpu_mat.cu.o.cmake: 208 (mensaje)), en mi proceso, pero también debo agregar

en

OpenCVDetectCUDA.cmake

Tiene:

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

cambiar a:

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

Funciono para mi


La solución @ api55 resuelve los errores relacionados con CUDA_nppi_LIBRARY . Entonces solo siga los pasos y funciona (para mí en Ubuntu 16.04 con opencv 3.3 ). Asegúrese de que su arquitectura GPU es compatible. Tengo Fermi que ya no es compatible. La solución es instalar Cuda-8 con el compilador gcc-5 al instalar opencv 3.3 con soporte cuda.


Probé la forma en que api555 dijo, pero cuando lo hizo, también construyó sm20, hice un poco más, dos formas:

1.en el archivo OpenCVDetectCUDA.cmake, línea 133, en el bucle " foreach(ARCH IN LISTS ARCH_LIST) ", agregue " elseif(ARCH MATCHES "20") entre if y else.

2.en el archivo OpenCVDetectCUDA.cmake, línea 46, " set(_generations "Fermi" "kepler" "Maxwell" "Pascal") " simplemente borre el "Fermi"

Prefiero la segunda forma, que me sirva de ayuda.


Probé lo siguiente y funcionó:

Cambie en FindCUDA.cmake la biblioteca nppi a los varios divididos. Esto debe hacerse en 3 lugares. Recuerde que este cambio es solo para que funcione con CUDA 9.0, no estoy haciendo comprobaciones para la versión ni nada, lo que debe hacerse si planea entregarlo a diferentes personas con diferentes versiones de CUDA.

1) busca la línea con:

find_cuda_helper_libs(nppi)

Y reemplazarlo con las líneas:

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) encuentra la línea:

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

y cambiarlo a

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) encuentre las variables no definidas y agregue también las nuevas variables Así que, encuentre:

unset(CUDA_nppi_LIBRARY CACHE)

y cambiarlo a:

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)

Y también en OpenCVDetectCUDA.cmake , debe eliminar la arquitectura 2.0 que ya no es compatible.

Tiene:

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

Debería ser:

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

Básicamente eliminé el primer if y el primer elif se convierte en if.

Como lo menciona @matko también tiene:

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

Que debe ser cambiado a:

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

Una última cosa es necesaria. CUDA 9.0 tiene un archivo separado para el halffloat ( cuda_fp16.h ) ahora. Esto debe ser incluido en OpenCV.

Desde el manual de CUDA 9.0:

Funciones no compatibles General CUDA library Biblioteca CUDA. Las funciones integradas __float2half_rn () y __half2float () se han eliminado. Utilice una funcionalidad equivalente en el archivo de encabezado fp16 actualizado del kit de herramientas CUDA.

Para hacer esto, necesitas agregar:

#include <cuda_fp16.h>

en el archivo de encabezado

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

Estos son los conceptos básicos para un parche definido para OpenCV. Lo que falta, bueno como lo dije antes, no me importan las versiones de CUDA (necesita un IF). Además, CUDA 9.0 tiene un montón de funciones obsoletas utilizadas por OpenCV ... esto probablemente será reemplazado por el equipo de OpenCV en algún momento. También es posible que una o más de las bibliotecas divididas de nppi no se utilicen.

Recomendaciones finales: para este tipo de cmakes complejos con tantas opciones, debe usar ccmake ( sudo apt-get install cmake-curses-gui ) para poder cambiar fácilmente las variables o al menos ver los valores, o una GUI real.

Para otras personas con Windows y Visual Studio 7, también tuve que cambiar la variable CUDA_HOST_COMPILER . De lo contrario, obtendrás un montón de errores con la cmd.exe exit with code 1 o algo similar ... parece que no pudo llegar con el autodetectado

Esto me funcionó con OpenCV 3.3 y CUDA 9.0 y Visual Studio 2017 con Windows 10. Creo que debería funcionar también en Ubuntu, ya que el error y los cambios están relacionados con CUDA. No lo he probado mucho, compilé y ejecuté algunas de las pruebas de rendimiento y todas pasaron ... Así que creo que todo funcionó bien.


Reemplace el opencv existente con la última versión, funciona bien. XD


Reemplazar FindCUDA.cmake y OpenCVDetectCUDA.cmake de https://github.com/opencv/opencv/tree/master/cmake (master branch- opencv 3.4.1) funciona para mí para opencv_2.4.13 con la tarjeta gráfica NVIDIA TitanXP de Pascal Architecture y con cuda-9.0 en Ubuntu 16.04.


También tuve que hacer lo siguiente en OpenCVDetectCUDA.cmake:

reemplazar

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

con

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