查看驱动支持的最高cuda版本:
可以看到我的是11.6.134,所以我可以安装这个版本及以下的cuda
https://developer.nvidia.com/cuda-11-6-1-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local
下载,如果想下其他版本,
点击第二个 “Archive of Previous CUDA Release”
注意:这个文件不用下载到C盘
双击下载好的文件进行安装,注意安装的时候选择自定义,然后取消驱动那一项(好像是第二个),特征是他会显示安装某个版本驱动,当前版本驱动是xx, 此时把这一项取消勾选,继续安装。建议装到默认的C盘吧,其实也不是很大。
https://developer.nvidia.cn/rdp/cudnn-archive
点进对应的,我的就是第一个,选择下载带windows的,是一个zip文件,这个不用下载到C盘
解压该文件,提取其中的文件夹bin,lib,include,分别复制其中内容到“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.x”中的bin,lib/x64,include中.
添加环境变量
CUDA安装的时候是自动添加的但是CUDNN不是,
我的电脑右键->属性->高级系统设置->高级->环境变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OA6x9hbN-1657200094832)(https://upload-images.jianshu.io/upload_images/6387939-a769fcf4d04c1332.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
编辑,添加下面三个(最好先打开C盘,或者自己装的路径,找到这几个地址,如果找不到,就下载一个everything软件,用关键字在everything里搜索一下,找到路径了再粘贴过去):
确定->确定(直接关界面会不生效)
验证是否安装成功:
1.win+r -> 输入cmd进入命令行模式,依次输入(第二行依然建议先找到这个地址粘贴过来):
nvidia-smi
cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite
deviceQuery.exe
bandwidthTest.exe
有result=pass 说明cudnn成功
项目名右键->生成依赖项->生成自定义
勾选CUDA
项目名右键->属性->
第一行填写(也可以不用)
$(CUDA_PATH)
确定
(本处参考https://www.cnblogs.com/wansuiwht/p/15811478.html)
在工程名上点击右键,选择添加——新建项。在新建项对话框中选择CUDA11.x,在右侧选择CUDA 11.x C/C++ File 文件名修改为main
复制下代码到main.cu,运行
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include
__global__ void VecAdd(int* A, int* B, int* C)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}
int main() {
const int size = 3;
int a[size] = { 1,2,3 };
int b[size] = { 10,20,30 };
int c[size] = { 0 };
//定义设备变量
int* dev_a = 0;
int* dev_b = 0;
int* dev_c = 0;
//CUDA状态
cudaError_t cudaStatus;
//选择GUP
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "选择GPU失败,您的电脑上没有GPU");
return 0;
}
//分配GUP内存
cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_c内存分配失败");
cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_a内存分配失败");
cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_b内存分配失败");
//从主机内存复制数据到GPU内存
cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "dev_a复制失败");
}
//从主机内存复制数据到GPU内存
cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "dev_b复制失败");
}
//调用GPU计算
VecAdd << <1, size >> > (dev_a, dev_b, dev_c);
//获取错误状态
cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "VecAdd 调用失败: %s\n", cudaGetErrorString(cudaStatus));
}
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize 返回错误 %d!\n", cudaStatus);
}
//将计算结果返回主机
cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "从GPU复制数据失败!");
}
printf("{1,2,3} + {10,20,30} = {%d,%d,%d}\n",
c[0], c[1], c[2]);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
return 0;
}
如果成功,会显示
可以开始你的CUDA之旅啦!
编写好cuda代码后直接用visual studio编译、调试功能即可完成编译及调试
安装好cudatoolkit后,nvcc -V 会看到cuda版本,此时也说明nvcc可用,我们可以直接用nvcc编译cuda代码
可以直接用是因为Linux上还需要host compiler,例如Ubuntu的build-essential包。这个是linux自带的。
进入官网 https://developer.nvidia.com/cuda-downloads 下载
下载runfile文件
cd runfile文件位置
sudo sh cuda_11.2.2_460.32.03_linux.run --override #指令前半部分和官网给的第二行一样
(注意如果没有override,有可能会报错)
运行后会卡一下,别急,这时候乱点可能电脑直接崩了,耐心等待一下。
弹出下一个界面选择continue
重点来了
runfile会自己再下一个CUDA驱动,但是本来已有驱动,所以会报错。在下一个界面取消勾选cuda driver(即第一个,方向键选中后回车取消,再方向键选中继续),过一会就装好了。
验证CUDATOOLKIT是否装好: nvcc -V
但是这时候还报错,因为还没有加入环境变量
sudo nano ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda/lib
export PATH=$PATH:/usr/local/cuda/bin
source ~/.bashrc
如果创建了usr,要在usr自己~目录下也加入环境变量
官网下载:
https://developer.nvidia.com/cudnn
tar -xvf cudnn...
先解压, 后将动态链接库和头文件放入相应目录
mv cuda/include/* /usr/local/cuda/include/
chmod +x cuda/lib64/* && mv cuda/lib64/* /usr/local/cuda/lib64/
安装完成以后,增加环境变量:
echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:${LD_LIBRARY_PATH} \n" >> ~/.bashrc
source ~/.bashrc && ldconfig
nvcc -arch=compute_x1 -code=sm_x2 hello_cuda.cu -o hello_cuda -run
其中 -arch 是中间指令, -code是真实二进制指令,CUDA C编译器只负责编译到中间指令,后面的一步需要其他方式得到。需要注意:
nvcc --device-c a.cu -o a.o
nvcc a.o b.cu -o b
./b
对–device-c的解释:
–可以直接理解成CPU上的-c, 因为CUDA 3.2之前的问题,导致了rdc的出现(3.2以前的CUDA要求跨文件隔离kernel和符号),所以-c变成了-rdc=true -c, 最终变成了-dc(–device-c)
TEST_SOURCE = hello_cuda02-test.cu
TARGETBIN := ./hello_cuda_multi_file
CC = /usr/local/cuda/bin/nvcc
$(TARGETBIN):$(TEST_SOURCE) hello_from_gpu.o
$(CC) -arch=compute_72 -code=sm_72 $(TEST_SOURCE) hello_from_gpu.o -o $(TARGETBIN)
hello_from_gpu.o:hello_from_gpu.cu
$(CC) -arch=compute_72 -code=sm_72 --device-c hello_from_gpu.cu -o hello_from_gpu.o
.PHONY:clean
clean:
-rm -rf $(TARGETBIN)
-rm -rf *.o
对makefile解释:
vscode相比vs,有很多插件,拥有强大的功能。另外vs每次必须生成一个solution,非常臃肿(但是大项目比较好用),而且linux只有vscode没有vs,因此等楼主考完试好好睡一觉了之后再来更新怎么用vs和cmake编译cuda代码。