编译cuda版opencv遇到的坑

CUDA编译

1.安装nvidia驱动

关闭图形界面,sudo stop lightdm,然后切换到tty1:Ctrl+Alt+F1即可
在纯字符界面下,登陆用户;
接下来就是最关键的一步了:sudo ./NVIDIA.run开始安装,安装过程比较快,根据提示选择即可
(Nvidia.run版本选择,自己根据显卡型号在nvidia官网http://geforce.com/drivers中查找)
最后安装完毕后,重新启动图形界面:sudo start lightdm,然后Ctrl+Alt+F7进入图形界面

2.安装cuda

1.直接在终端运行sudo sh ./cuda_*.run即可(cuda_*对应下载的版本型号)
2.值得注意的一点:
#只有一个选项选择no:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.62?
(y)es/(n)o/(q)uit: n
3.$sudo vim .bashrc
添加2行
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
$source .bashrc #更新bashrc

编译opencv(cuda8.0+opencv2.4.13)

opencv相应的依赖库:

sudo apt-get install build-essential
sudo apt-get install pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev  libtiff4-dev  libswscale-dev libjasper-dev 
sudo apt-get install cmake  
1.问题1: cuda8.0新出,opencv2.4.13不支持。报错:
/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared
     typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat
                                                      ^
/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:135:18: error: ‘NppiGraphcutState’ does not name a type
         operator NppiGraphcutState*()
                  ^
/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:141:9: error: ‘NppiGraphcutState’ does not name a type
         NppiGraphcutState* pState;
解决方案:需要修改一处源码:
在graphcuts.cpp中将
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) 
改为
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
2.问题2:
/usr/include/string.h: In functionvoid* __mempcpy_inline(void*, const void*, size_t)’: /usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope return (char *) memcpy (__dest, __src, __n) + __n;
解决方案:CMakeList.txt 文件的开头加入
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -D_FORCE_INLINES”)
3.问题3:架构错误

编译cuda版opencv遇到的坑_第1张图片
解决方案:cmake时添加选项

-D CUDA_GENERATION=Kepler #Kepler架构
4.opencv可编译成功,但运行时始终遇到问题:
Invalid device function
这是因为编译的opencv计算能力与电脑显卡的实际计算能力不匹配导致的。一般而言直接添加一下2个cmake编译选项即可解决
-D CUDA_ARCH_BIN=6.1 -D CUDA_ARCH_PTX=6.1
#Note:6.1为GTX1080的计算能力,不同显卡需要根据自己的计算能力进行修改
#查询显卡计算能力,可以通过运行cuda samples中的deviceQuery得知。
#(文件夹NVIDIA_CUDA-*_Samples下编译示例, *为版本号)
如果设置成功,cmake界面会有如下显示

编译cuda版opencv遇到的坑_第2张图片

GPU arch/PTX archs都被设置为6.1
但如果运气不佳,添加编译选项并不能解决问题。这时候我们需要修改opencv中关于CUDA计算能力这部分的配置文件./cmake/OpenCVDetectCUDA.cmake。在
set(CUDA_ARCH_BIN ${__cuda_arch_bin} CACHE STRING "Specify 'real' GPU architectures to build binaries for, BIN(PTX) format is supported")
  set(CUDA_ARCH_PTX ${__cuda_arch_ptx} CACHE STRING "Specify 'virtual' PTX architectures to build PTX intermediate code for")

之前添加

set(__cuda_arch_bin "6.1")
set(__cuda_arch_ptx "6.1")
5.设置安装路径
-D CMAKE_INSTALL_PREFIX=/usr/local
6.编译CUDA版本
-D WITH_CUDA=ON

你可能感兴趣的:(深度学习实验室)