Construire OpenCV avec le soutien de CUDA
J'utilise CMake pour générer la solution visual studio 2013. Prochaine im essayer de le construire, mais se suivre d'erreur:
construction de modules d'objets NVCC (Device)/core/CMakeFiles/cuda_compile.dir / src/cuda/Debug / cuda_compile_generated_gpu_mat.cu.obj
nvcc fatale : non pris en charge architecture gpu 'compute_11'
Im essayer les versions 2.10 et 3.0 avec cuda 6.5 et 7.0. Cuda_arch_bin réglé à : 1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5
8 réponses
une autre option. Ubuntu 14.04, GTX Titan X, opencv-2.4.10
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Auto -D BUILD_NEW_PYTHON_SUPPORT=ON ..
j'ai aussi appliqué le patch,
mais je ne suis pas sûr qu'il a fini par être nécessaire. J'avais essayé avec et sansCUDA_GENERATION=Maxwell
mais Maxwell n'est pas détecté. Je n'ai pas essayer CUDA_GENERATION=Auto
avant le patch, c'est pourquoi je ne suis pas sûr.
lorsque vous utilisez cmake pour faire des configurations, définissez l'option CUDA_GENERATION pour préciser votre architecture GPU. J'ai rencontré la même erreur et j'ai essayé de résoudre le problème.
suite à la réponse de Yun( ne pouvait pas laisser de commentaire), cela a fonctionné pour moi et montre une valeur possible pour CUDA_GENERATION:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..
(Ubuntu 12.04 et 14.04, GTX Titan, et OpenCV 2.4.11 et 3.0.0.)
Vous pouvez utiliser CUDA_GENERATION
pour spécifier le nom de code de génération correspondant pour votre architecture GPU.
Voici le opencv cmake code qui analyse l' CUDA_GENERATION
valeur:
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")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
elseif(CUDA_GENERATION STREQUAL "Pascal")
set(__cuda_arch_bin "6.0 6.1")
elseif(CUDA_GENERATION STREQUAL "Volta")
set(__cuda_arch_bin "7.0")
elseif(CUDA_GENERATION STREQUAL "Auto")
execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" ${CUDA_NVCC_FLAGS} "${OpenCV_SOURCE_DIR}/cmake/checks/OpenCVDetectCudaArch.cu" "--run"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT _nvcc_res EQUAL 0)
message(STATUS "Automatic detection of CUDA generation failed. Going to build for all known architectures.")
else()
set(__cuda_arch_bin "${_nvcc_out}")
string(REPLACE "2.1" "2.1(2.0)" __cuda_arch_bin "${__cuda_arch_bin}")
endif()
endif()
et la page wikipedia CUDA a une belle table pour mapper votre carte vidéo au bon nom de code de microarchitecture (désolé, il est trop grand pour reproduire ici):
https://en.wikipedia.org/wiki/CUDA#GPUs_supported
par exemple, my middling-2012 Macbook Pro a une GeForce GT 650M antique, que la table wikipedia indique utilise la microarchitecture Kepler. Par conséquent, j'utilise ceci dans ma ligne de commande cmake:
cmake -D CUDA_GENERATION="Kepler" ...
et le script opencv convertit cela en "3.0 3.5 3.7" quand il affiche le résumé de configuration, et transmet les options correspondantes à nvcc
.
dans mon cas, avant de régler cela correctement, j'ai eu des erreurs à propos de compute_70
pas pris en charge. Apparemment, il y a toujours un question ouverte dans le opencv tracker à partir d'aujourd'hui (2017-10-07) sur l'auto-détection ne fonctionne pas correctement.
c'est à cause de votre type gpu qui ne correspond pas.
vous devez définir CUDA_GENERATION explicitement.
dans mon côté, je pourrais trouver 3 types de CUDA_GENERATION; Auto, Kepler, Fermi.
quand J'ai défini CUDA_GENERATION comme Kepler, compute_11 a changé pour compute_30 et construire avec succès.
vous devriez définir avec cmake
ces entrées CUDA_ARCH_BIN = 3.2
et CUDA_ARCH_PTX = 3.2
j'Espère que ça aide.
Cordialement
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Kepler -D BUILD_NEW_PYTHON_SUPPORT=ON ..
a travaillé pour moi pour OpenCV 2.4.11