CUDA11.6+Windows10+Visual Studio 2019環境安裝配置
一.下載
打開官網下載下載頁面,點擊立即下載。Operating System(操作系統)選擇windows,Architecture(架構)x86_64,Version(版本)選擇10.Installer Type安裝類型選擇 exe(local),即可展開下載連接按鈕,點擊下載。
二.安裝
點這里查看官方安裝文檔
安裝CUDA前應確保先安裝Visual Studio 2019.這樣在CUDA安裝過程中會自動檢測配置Visual Studio2019插件,省去不必要的麻煩。
安裝過程比較簡單,雙擊運行下載的文件,選擇解壓路徑,解壓后會自動打開安裝程序,安裝程序執行完系統檢查后進入到安裝選項頁面,這里需要注意的是,如果選擇精簡就不能選擇安裝路徑,默認會安裝到C盤。如果選擇自定義則可以選擇安裝路徑,根據自己需要選擇后,一路下一步即可完成安裝。
安裝成功后打開命令提示符輸入 nvcc --version回車,如果顯示以下內容則表示安裝成功。
三.測試
這種方式可用於在已有工程中引入CUDA開發
1.打開visual studio 2019 創建win32空項目。
2.在工程名上點擊右鍵,選擇生成依賴項——生成自定義。在彈出的對話框中勾選CUDA11.6.
3.在工程名上點擊右鍵,選擇屬性,點擊CUDA/C++ —— Common。在CUDA Toolkit custom Dir 后面添加 $(CUDA_PATH),這個是CUDA的環境變量,安裝時安裝程序會將其添加到系統的環境變量中。
3.在工程名上點擊右鍵,選擇添加——新建項。在新建項對話框中選擇CUDA11.6,在右側選擇CUDA 11.6 C/C++ File 文件名修改為main
4.在新創建的文件中輸入以下代碼
#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;
}
運行,如果沒有錯誤應顯示以下頁面。