1. 可以下載Geforce Experience果覆,將顯卡驅(qū)動(dòng)更新到上面最新
2. 桌面右鍵-->Nvidia控制面板->幫助->系統(tǒng)信息->組件
查看驅(qū)動(dòng)支持的最高cuda版本:
可以看到我的是11.6.134,所以我可以安裝這個(gè)版本以下的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
下載椭岩,如果想下其他版本绕娘,
點(diǎn)擊第二個(gè) "Archive of Previous CUDA Release"
注意:這個(gè)文件不用下載到C盤(pán)
4. 雙擊下載好的文件進(jìn)行安裝委可,注意安裝的時(shí)候選擇自定義映皆,然后取消驅(qū)動(dòng)那一項(xiàng)(好像是第二個(gè)),特征是他會(huì)顯示安裝某個(gè)版本驅(qū)動(dòng)厨埋,當(dāng)前版本驅(qū)動(dòng)是xx邪媳, 此時(shí)把這一項(xiàng)取消勾選,繼續(xù)安裝荡陷。建議裝到默認(rèn)的C盤(pán)吧雨效,其實(shí)也不是很大。
5.安裝CUDNN
https://developer.nvidia.cn/rdp/cudnn-archive
點(diǎn)進(jìn)對(duì)應(yīng)的废赞,我的就是第一個(gè)徽龟,選擇下載帶windows的,是一個(gè)zip文件唉地,這個(gè)不用下載到C盤(pán)
解壓該文件据悔,提取其中的文件夾bin传透,lib,include极颓,分別復(fù)制其中內(nèi)容到“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.x”中的bin,lib/x64,include中.
6.添加環(huán)境變量:
CUDA安裝的時(shí)候是自動(dòng)添加的但是CUDNN不是朱盐,
我的電腦右鍵->屬性->高級(jí)系統(tǒng)設(shè)置->高級(jí)->環(huán)境變量
編輯,添加下面三個(gè)(最好先打開(kāi)C盤(pán)菠隆,或者自己裝的路徑兵琳,找到這幾個(gè)地址,如果找不到骇径,就下載一個(gè)everything軟件躯肌,用關(guān)鍵字在everything里搜索一下,找到路徑了再粘貼過(guò)去):
確定->確定(直接關(guān)界面會(huì)不生效)
驗(yàn)證是否安裝成功:
1.win+r -> 輸入cmd進(jìn)入命令行模式破衔,依次輸入(第二行依然建議先找到這個(gè)地址粘貼過(guò)來(lái)):
nvidia-smi
cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite
deviceQuery.exe
bandwidthTest.exe
說(shuō)明cuda安裝完成
有result=pass 說(shuō)明cudnn成功
7.配置vs:
打開(kāi)一個(gè)空的c++控制臺(tái)
換成x64清女,這個(gè)不改好像也沒(méi)事
項(xiàng)目名右鍵->生成依賴(lài)項(xiàng)->生成自定義
勾選CUDA
項(xiàng)目名右鍵->屬性->
第一行填寫(xiě)
$(CUDA_PATH)
確定
參考https://www.cnblogs.com/wansuiwht/p/15811478.html
在工程名上點(diǎn)擊右鍵,選擇添加——新建項(xiàng)晰筛。在新建項(xiàng)對(duì)話(huà)框中選擇CUDA11.x嫡丙,在右側(cè)選擇CUDA 11.x C/C++ File 文件名修改為main
復(fù)制下代碼到main.cu,運(yùn)行
#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 };
//定義設(shè)備變量
int* dev_a = 0;
int* dev_b = 0;
int* dev_c = 0;
//CUDA狀態(tài)
cudaError_t cudaStatus;
//選擇GUP
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "選擇GPU失敗传惠,您的電腦上沒(méi)有GPU");
return 0;
}
//分配GUP內(nèi)存
cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_c內(nèi)存分配失敗");
cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_a內(nèi)存分配失敗");
cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
if (cudaStatus != cudaSuccess)
fprintf(stderr, "dev_b內(nèi)存分配失敗");
//從主機(jī)內(nèi)存復(fù)制數(shù)據(jù)到GPU內(nèi)存
cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "dev_a復(fù)制失敗");
}
//從主機(jī)內(nèi)存復(fù)制數(shù)據(jù)到GPU內(nèi)存
cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "dev_b復(fù)制失敗");
}
//調(diào)用GPU計(jì)算
VecAdd << <1, size >> > (dev_a, dev_b, dev_c);
//獲取錯(cuò)誤狀態(tài)
cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "VecAdd 調(diào)用失敗: %s\n", cudaGetErrorString(cudaStatus));
}
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize 返回錯(cuò)誤 %d!\n", cudaStatus);
}
//將計(jì)算結(jié)果返回主機(jī)
cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "從GPU復(fù)制數(shù)據(jù)失敗!");
}
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;
}
如果成功迄沫,會(huì)顯示