1. 可以下载Geforce Experience,将显卡驱动更新到上面最新
2. 桌面右键-->Nvidia控制面板->帮助->系统信息->组件
查看驱动支持的最高cuda版本:
image.png
可以看到我的是11.6.134,所以我可以安装这个版本以下的cuda
3. https://developer.nvidia.com/cuda-11-6-1-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local
image.png下载,如果想下其他版本,
image.png
点击第二个 "Archive of Previous CUDA Release"
注意:这个文件不用下载到C盘
4. 双击下载好的文件进行安装,注意安装的时候选择自定义,然后取消驱动那一项(好像是第二个),特征是他会显示安装某个版本驱动,当前版本驱动是xx, 此时把这一项取消勾选,继续安装。建议装到默认的C盘吧,其实也不是很大。
5.安装CUDNN
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中.
6.添加环境变量:
CUDA安装的时候是自动添加的但是CUDNN不是,
我的电脑右键->属性->高级系统设置->高级->环境变量
编辑,添加下面三个(最好先打开C盘,或者自己装的路径,找到这几个地址,如果找不到,就下载一个everything软件,用关键字在everything里搜索一下,找到路径了再粘贴过去):
image.png
确定->确定(直接关界面会不生效)
验证是否安装成功:
1.win+r -> 输入cmd进入命令行模式,依次输入(第二行依然建议先找到这个地址粘贴过来):
nvidia-smi
cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite
deviceQuery.exe
bandwidthTest.exe
image.png
说明cuda安装完成
image.png image.png有result=pass 说明cudnn成功
7.配置vs:
打开一个空的c++控制台
image.png image.png
换成x64,这个不改好像也没事
项目名右键->生成依赖项->生成自定义
勾选CUDA
image.png
项目名右键->属性->
image.png第一行填写
$(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 <iostream>
__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;
}
如果成功,会显示
image.png
网友评论