参考博客:
https://davidstutz.de/compiling-opencv-2-4-x-with-cuda-9/
在尝试使用CUDA 9编译OpenCV 2(例如OpenCV 2.4.13.6)时,主要有两个问题:
- 该
nppi
库在CUDA 9下被拆分为一系列库,防止发送的FindCUDA.cmake
脚本找到它; - 并且
FindCUDA.cmake
没有正确处理最新的GPU架构。
第一个问题解决:
https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound
修改好的下载地址:
https://github.com/davidstutz/opencv-2.4-cuda-9-patch
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)
然后
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}")
接着
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
,解决第二个问题需要另外两个调整。特别是,_generations
变量需要反映最新的GPU代,并需要将它们正确映射到相应的计算功能。
搜索 _generations 找到下面这一行
完成替换
set(_generations "Fermi" "Kepler" "Maxwell" "Pascal" "Volta")
然后找到下面这一行
变成:
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")
最后,为避免编译错误,--expt-relaxed-constexpr
需要设置NVCC标志。为此,FindCUDA.cmake
需要进行调整:
找到一个大致的位置,添加一句话:
set(nvcc_flags "--expt-relaxed-constexpr")
最后cmake的时候
搜索 CUDA_GENERATION
这个是你的GPU架构
我是笔记本GTX1060
https://www.techpowerup.com/gpu-specs/geforce-gtx-1060-mobile.c3016
架构是 Pascal
所以camke的时候,将CUDA_GENERATION设置为Pascal
Fermi Kepler Maxwell Pascal Volta Auto
这个项,只能设置上述的值
现在是2018.11.4,估计未来会有更多的好显卡和选项,谁知道呢,暂时就这么多