一、安装anaconda
anaconda是用于科学计算的python发行版。
直接在官网上下载(速度比较慢,也可以在清华镜像下载,速度会快一点)。
官网链接:https://www.anaconda.com/distribution/
清华镜像链接:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/
下载完成后,按照教程安装,注意添加进环境变量,不然安装以后也无法启动。
安装以后,在cmd中输入conda list,查看是否能使用conda命令,若可以,则安装成功。
我安装的最新版,所以python对应的版本是3.7,anaconda的版本是4.7.12.
二、安装vs2017
安装时选择python环境, 并且勾选anaconda3,选择默认位置安装。
如果在安装时不确定具体需要安装哪些组件,可以先把需要的勾选上。以后可以再修改,修改方式是以管理员身份运行visualtudio installer,然后选择更改,勾选上需要的组件即可。
我是安装了python、c++的组件,然后在单个组件中还添加了vs2017 版本编译工具集。
三、在vs2017中配置opencv
opencv版本与python版本有对应关系。首先在网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv上下载对应版本的opencv。
我下载的是红框里的版本。
终端进入到存放该下载文件的位置,运行pip install opencv_python-4.1.2-cp36-cp36m-win_amd64.whl命令,即可完成安装。
终端输入python,import cv2,如果不报错,即安装正确。
但是基于上诉方法安装的opencv,没有生成对应的opencv/build文件,只能在python中使用。
打开vs2017,创建python空项目,在解决方案-右键python环境-查看所有python环境-选择一个已创建的环境,添加空文件,输入读取和显示图像的代码,运行即可。
至此,vs2017中,基于python的环境已配置成功。
为了能在c++中也运行opencv,我又在官网https://opencv.org/releases/中下载opencv4.1.1(特别慢,我下载了整整一个下午),是一个exe文件。
双击该exe文件,选择想要安装的位置(这个位置很重要,一定牢记,我是安装在d盘了)。
安装完以后将D:\soft\opencv\opencv\build\x64\vc15\bin下的2个dll文件移动到C:\Windows\System32
然后打开vs2017,新建一个c++空项目,打开属性页-vc++目录,添加包含目录和库目录
把build/include文件和它下面的opencv2文件路径添加到包含目录,把build/x64/vc15/lib文件添加到库目录。
属性页-链接器-输入-附加依赖项,把上一步添加的库目录下的lib文件添加进去。注意只添加一个,因为我用的debug模式,所以添加的是xxxd.lib。
然后添加一个空的c++文件,输入以下读取和显示图像的代码,运行即可。注意图像的路径最好的绝对路径。
#include <opencv2/opencv.hpp> int main() { cv::Mat img = cv::imread("F:\\vs_work\\cv_test\\cv\\w.jpg"); cv::namedWindow("img", cv::WINDOW_AUTOSIZE); cv::imshow("img", img); cv::waitKey(0); cv::destroyWindow("img"); return 0;}
四、安装CUDA
CUDA是GPU并行计算框架。
接下来的步骤,版本之间的对应关系很重要。
我的电脑是64位的win10,显卡版本是417.88,因此需要下载CUDA10
进入CUDA官网https://developer.nvidia.com/cuda-10.0-download-archive,下载与显卡对应版本。我的选择如下
比较大,2.1G,下载完以后双击安装。
选择精简安装、默认安装位置。
命令端输入nvcc -V,如果输出信息,则安装成功。
五、安装cudnn
cudnn下载链接:https://developer.nvidia.com/rdp/cudnn-download
选择适合自己电脑系统和显卡的型号,我下载的是win10、CUDA10版的。
下载完以后解压,将解压后的3个文件分别复制到对应CUDA中。
a) Copy <installpath>\cuda\bin\cudnn64_7.dll to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin. b) Copy <installpath>\cuda\ include\cudnn.h to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include. c) Copy <installpath>\cuda\lib\x64\cudnn.lib to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64.
六、在vs2017里配置CUDA运算环境
1.首先新建一个visual c++空项目,取名test。
2.右击源文件,添加,新建项,NVIDIA CUDA10.0,code,添加CUDA C/C++ File,命名cuda_test。
3.选择项目,右击,生成依赖项,生成自定义,选中CUDA10.0
4,选择项目,属性,配置属性,VC++目录,包含目录,添加以下目录
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\common\inc C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include
添加以下库目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64 C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\common\lib\x64
5,配置CUDA静态链接器
项目-属性-连接器-常规-附加库目录,添加以下目录:
$(CUDA_PATH_V10_0)\lib\$(Platform)
6,选用CUDA静态链接库
项目-属性-连接器-输入-附加依赖项,添加以下项(这些项是第4步中添加的库下的库,根据自己的库添加,我参考的https://www.cnblogs.com/wayne793377164/p/8185404.html的库,结果有2个库我没有,后面编译的时候报错,把多出的2个库删掉才可):
cublas.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
7,测试
测试程序为:
// CUDA runtime 库 + CUBLAS 库
#include "cuda_runtime.h"
#include "cublas_v2.h"
#include <time.h>
#include <iostream>
using namespace std;
// 定义测试矩阵的维度
int const M = 5;
int const N = 10;
int main()
{
// 定义状态变量
cublasStatus_t status;
// 在 内存 中为将要计算的矩阵开辟空间
float *h_A = (float*)malloc (N*M*sizeof(float));
float *h_B = (float*)malloc (N*M*sizeof(float));
// 在 内存 中为将要存放运算结果的矩阵开辟空间
float *h_C = (float*)malloc (M*M*sizeof(float));
// 为待运算矩阵的元素赋予 0-10 范围内的随机数
for (int i=0; i<N*M; i++) {
h_A[i] = (float)(rand()%10+1);
h_B[i] = (float)(rand()%10+1);
}
// 打印待测试的矩阵
cout << "矩阵 A :" << endl;
for (int i=0; i<N*M; i++){
cout << h_A[i] << " ";
if ((i+1)%N == 0) cout << endl;
}
cout << endl;
cout << "矩阵 B :" << endl;
for (int i=0; i<N*M; i++){
cout << h_B[i] << " ";
if ((i+1)%M == 0) cout << endl;
}
cout << endl;
/*
** GPU 计算矩阵相乘
*/
// 创建并初始化 CUBLAS 库对象
cublasHandle_t handle;
status = cublasCreate(&handle);
if (status != CUBLAS_STATUS_SUCCESS)
{
if (status == CUBLAS_STATUS_NOT_INITIALIZED) {
cout << "CUBLAS 对象实例化出错" << endl;
}
getchar ();
return EXIT_FAILURE;
}
float *d_A, *d_B, *d_C;
// 在 显存 中为将要计算的矩阵开辟空间
cudaMalloc