Index 目录索引
写在前面
以前只是在 PyCharm
编译环境中调用 GPU
来运行程序,这篇文章将记录 VS
编译环境中如何使用 CUDA
调用 GPU
来运行程序。
1 VS的安装
如果要在VS中调用CUDA,需先按照VS编译环境,因为CUDA在安装的过程中会自动将相关文件安装至VS环境中,所以要先安装VS
,安装教程这里不再赘述。
2 CUDA 的安装和配置
2.1 CUDA的安装
首先是CUDA的下载和安装,安装教程这里不再赘述,要注意CUDA和GPU版本的对应。
2.2 CUDA环境变量的配置
参考这篇文章,在电脑中打开环境变量
,根据下图,在系统变量
里添加如下内容:
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
【注】CUDA _PATH
与CUDA _PATH_V10_1
是安装CUDA在时自动添加的,CUDA _PATH_V10_1
中的10_1
指的是安装的CUDA版本号。
接着, 根据下图所示,添加以下内容到用户变量
的path
中:
%CUDA_LIB_PATH%
%CUDA_BIN_PAHT%
%CUDA_SDK_BIN_PAHT%
%CUDA_SDK_LIB_PATH%
2.3 检验CUDA环境变量的配置
重启电脑,打开cmd,在命令行中输入 set cuda
,可以看到刚才配置的CUDA
的环境变量配置信息。
接下来通过cd命令切换到如下目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite
输入如下命令:
deviceQuery.exe
即运行该目录下的deviceQuery.exe
,如下所示:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite>deviceQuery.exe
会在命令框中输出GPU的信息,如果最下面如下语句:
Result=PASS
则表示CUDA已安装和配置成功,且能调用CUDA加速程序的运行。
或者可以进入到如下所示的CUDA自带的测试案例目录中,如图所示:
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1\1_Utilities\deviceQuery
用VS
打开*.sln
文件,同样的,运行如果输出GPU的信息,则表示CUDA已配置成功,且能调用CUDA加速程序的运行。
3 VS中CUDA的配置
打开VS,新建工程后,如果想要调用GPU加速程序,则要找到属性管理器
,在Debug
模式中,新建一个*.props
文件,点击右键,打开属性页
,如下图所示,在左侧找到VC++目录
,接着在包含目录
中添加C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
,在库目录
中添加C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
。
其次,如下图所示,在左侧找到链接器
,接着找到下面的输入
,在右侧的附加依赖项
中,添加如下内容:
cublas.lib
cublasLt.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvgraph.lib
nvml.lib
nvrtc.lib
OpenCL.lib
至此,VS编译环境中的CUDA已经配置完毕。
4 VS中OpenCV的CUDA版本编译
在VS编译环境下,调用OpenCV库进行图像处理的过程中,如果想要使用GPU加速,则需要对OpenCV进行相应的编译,即编译Opencv的CUDA版本,用以驱动GPU。
(未完待续…)
本小节通过记录CUDA的编译过程,以期做到授之以渔。
4.1 未使用CUDA加速时
C++的图像处理代码,在未使用CUDA加速时,处理一张图像的速度可能要500ms左右,接下来尝试如何使用CUDA加速。
4.2 不修改代码,直接使用编译CUDA后的OpenCV来运行
官网下载的OpenCV是CPU版本的,如若想要调用GPU来运行程序,首先要编译CUDA版本的OpenCV,编译方法可以参考前辈的这篇文章。
编译后,再次运行代码,一张图像的处理时间可以由原来的 500ms
降至 200ms
,但通过检查代码运行过程中GPU的消耗,发现并未实现真正意义上的GPU调用,接下来需要修改代码。
4.3 编译OpenCV CUDA后,添加CUDA加速的代码
在原有代码的基础上,尝试修改代码,目的是实现真正意义上的GPU调用。在原有程序中添加下列CUDA加速的代码:
//加上这样几句之后,程序再运行dnn计算时,会使用gpu加速
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
//net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
//net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
一张图像的处理所用时间继续降至了 2ms
。
【注】经试验发现,如果只添加CUDA加速的代码,而不使用经过OpenCV CUDA编译的库,则无法调用CUDA使用GPU加速。
安装过程中可能遇到的问题
情况1
在VS点击生成解决方案,会出现下面这样的找不到SDK
报错信息,如下如图所示:
找不到windows SDK版本10.0.15063.0
可能原因:缺少相应的SDK。
解决办法:参考这篇文章和这篇文章,如下图所示,无需重装VS
,找到VS的安装软件,点击打开,点击修改(modify),缺少哪个版本安装哪个windows SDK即可。