安装 virtual C++

地址1:https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads

地址2:https://www.microsoft.com/en-us/download/details.aspx?id=48145

我这里选择x64,根据平台选择

下载 vc_redist.x64.exe

然后安装,需要重启生效。

至少这个玩意安装了之后,你的cmd应该是认识 nvcc 命令的

安装 CUDA Toolkit

这里是选择的10.2 你也可以选择其他版本,

官网在这里:https://developer.nvidia.com/cuda-toolkit

10.2地址:https://developer.nvidia.com/cuda-10.2-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

安装过程一切从简,我选择默认路径。点击安装。就能看到下面这个,等其完成了,再说。

image-20201228151704310

选择接受协议

image-20201228152219546

这里因人而异,笔者选择自定义,选择了全部组件

image-20201228152256688

image-20201228152401200

安装位置笔者默认

然后一路下一步到安装结束

他会自己添加一些环境变量,但是我们这里还需要自己再手动添加一些(如果你修改了默认安装目录,下面的参数就要做相应的调整)

image-20201228153126964

在环境变量的系统变量中添加如图(如下)的变量

1
2
3
4
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

然后再在系统变量的path中添加下面的内容

image-20201228153503318

1
2
3
4
5
6
C:\Program Files\NVIDIA Corporation\NVSMI
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\libnvvp

下载 CUDA cdDNN

官网在这里:https://developer.nvidia.com/cudnn

记住下载和Toolkit一样的版本。

我也是下载10.2

下载解压之后有一个 cuda 文件夹,下面有4个文件

image-20201228153605657

然后打开目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 也就是你的CUDA Toolkit的安装目录。10.2是版本。不同版本就不同。

里面也有上面的三个目录,直接拷贝过来进行替换。

image-20201228153936104

然后刚刚下载的cuDNN文件就可以删除了,但是在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 目录下的得保留。

验证

nvcc -V 这个都没有肯定是不对的,有的话不一定是对的

image-20201228154123999

移步到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite 里面有两个程序 bandwidthTest.exe和deviceQuery.exe

image-20201228154518906

这里列举了你的显卡的一些各种参数信息,型号,驱动版本,核心数,各级显存等等。

image-20201228154629839

安装pycuda

1
pip install pycuda

顺利你成功了?

但是你也有可能会像我一样,报错。这说明 visual C++ 14.0 没有安装。

image-20201228155545116

虽然根据报错的提示,会让我们去微软的官方下载,但是我们只是想跑个pycuda,安装十多个G的VS并不划算。我是拒绝安装的。

debug

于是随便查阅资料会发现,可以通过 Microsoft Visual C++ Build Tools 来解决问题。如果你本来就想用VS我并不反对。

参考:https://blog.csdn.net/u012247418/article/details/82314129

这里下载:visualcppbuildtools_full.exe

下载之后,双击运行

然后我们选择自定义 只选择了win10的SDK,按照默认我这波报错了,我也没办法。

image-20201228174358649

image-20201228173423760

安装完毕后会在C盘中出现这个目录 C:\Program Files (x86)\Microsoft Visual Studio 14.0

然后我们添加一个环境变量,将 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64 添加到path中。

image-20201228181144547

image-20201228181221006

然后我们来测试一下是否安装成功,准备一个 helloworld.c

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main()
{

printf("hello vs build tools.\n");
printf("press any key to exit.\n");
getchar();
return 0;

}

然后打开终端运行:

1
cl helloworld.c

命令输出正常只是找不到include,说明命令没问题了

image-20201228175811469

如果报错:

VCRUNTIME140_1.dll

就说明前面的 VC_redist.x64.exe 没有安装好,重新装一下就好了。

然后就可以装了

image-20201228180038157

image-20201228180046322

网上有个说法让去某个神奇网站下载pycuda对应的whl文件,虽然的确能在一开始就能安装成功,但是我不敢保证后面不会出问题,因为pycuda毕竟还是需要cl.exe来将cuda进行编译的,没有这个配置,那样的成功安装,无异于鸵鸟。

再测试

新建一个 a+b.cu

1
2
3
4
5
6
7
8
__global__ void add(int *a, int *b, int *c, int *n){

int tid = threadIdx.x;

if(tid < (*n)){
c[tid] = a[tid] + b[tid];
}
}

进行编译: nvcc -c a+b.cu 虽然有很多warnning 但是没有error。

image-20201228181833855

image-20201228181914396

并且成功编译出来了文件

image-20201228181948290

说明可以,我们再结合pycuda试试。新建 a+b.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pycuda.autoinit
import pycuda.driver as drv
from pycuda.compiler import SourceModule

# 读取文件
with open('a+b.cu', 'r', encoding = 'utf-8') as f:
cuf = f.read()
mod = SourceModule(cuf)

# 获取kernal函数
add_func = mod.get_function('add')

# 导入 numpy
import numpy as np

# 初始化 a, b, c
a = np.array([1,2,3,4,5,6,7,8,9,10], dtype = np.int32)
b = np.array([2,3,5,6,7,1,2,5,1,32], dtype = np.int32)
c = np.full((10, ), 0).astype(np.int32)
n = np.int32(10)

# c = a+b
add_func(drv.In(a), drv.In(b), drv.InOut(c), drv.In(n), block=(32,1,1), grid=(1,1))

# print
print(c)