VS2015 配置cuda8.0


總結如下:

1  官網下載和系統匹配的cuda 軟件  https://developer.nvidia.com/cuda-downloads

2  直接使用默認選項安裝 

3 設置環境變量: 
安裝完畢后,在計算機上點右鍵,打開屬性->高級系統設置->環境變量,可以看到系統中多了CUDA_PATH和CUDA_PATH_V8_0兩個環境變量,接下來,還要在系統中添加以下幾個環境變量: 
  CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0 
  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 
因為安裝路徑是默認的,所以添加的路徑分別是下面這樣的: 
CUDA_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 
CUDA_PATH_V8_0 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 
CUDA_SDK_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0 
CUDA_LIB_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64 
CUDA_BIN_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin 
CUDA_SDK_BIN_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64 
CUDA_SDK_LIB_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\common\lib\x64 
然后,在系統變量 PATH 的末尾添加: 
 ;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%; 
;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\common\lib\x64;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64; 
重新啟動計算機

4 VS 配置:

  • 1.打開vs2013並創建一個空win32程序,創建一個cuda_samples的解決方案和cuda_test1項目: 
  • 2.右鍵源文件–>添加–>新建項,如下圖所示:

  • 3.選擇NIVIDIA CUDA7.5中 CUDA C/C++file,並在名稱那填上cuda_main

  • 4.選擇cuda_test1,點擊右鍵–>項目依賴項–>自定義生成

  • 5.選擇CUDA7.5

  • 6.點擊cuda_main.cu的屬性

    1. 在配置屬性–>常規–>項類型–>選擇“CUDA C/C++”

5 項目配置 

5.1 包含目錄配置

  • 1.右鍵點擊項目屬性–>屬性–>配置屬性–>VC++目錄–>包含目錄
  • 2.添加包含目錄: 
    $(CUDA_PATH)\include

5.2 庫目錄配置

  • 1.VC++目錄–>庫目錄
  • 2.添加庫目錄: 
    $(CUDA_PATH)\lib\x64

5.3 依賴項

    1. 配置屬性–>連接器–>輸入–>附加依賴項
    1. 添加庫文件: 
      cublas.lib 
      cuda.lib 
      cudadevrt.lib 
      cudart.lib 
      cudart_static.lib 
      nvcuvid.lib 
      OpenCL.lib

注意:添加nvcuvenc.lib庫文件,編譯時,報找不到該文件的錯誤。去掉后,程序也能運行

6 測試程序

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// CUDA runtime 庫 + CUBLAS 庫
#include "cuda_runtime.h"
#include "cublas_v2.h"
#include <time.h>
#include <iostream>
 
using  namespace  std;
// 定義測試矩陣的維度
int  const  M = 5;
int  const  N = 10;
int  main()
{
// 定義狀態變量
cublasStatus_t status;
// 在內存中為將要計算的矩陣開辟空間
float  *h_A = ( float *) malloc (N*M* sizeof ( float ));
float  *h_B = ( float *) malloc (N*M* sizeof ( float ));
// 在 內存 中為將要存放運算結果的矩陣開辟空間
float  *h_C = ( float *) malloc (M*M* sizeof ( float ));
// 為待運算矩陣的元素賦予 0-10 范圍內的隨機數
for  ( int  i = 0; i<N*M; i++) {
     h_A[i] = ( float )( rand () % 10 + 1);
     h_B[i] = ( float )( rand () % 10 + 1);
}
// 打印待測試的矩陣
cout <<  "矩陣 A :"  << endl;
for  ( int  i = 0; i<N*M; i++){
     cout << h_A[i] <<  " " ;
     if  ((i + 1) % N == 0) cout << endl;
}
cout << endl;
cout <<  "矩陣 B :"  << endl;
for  ( int  i = 0; i<N*M; i++){
     cout << h_B[i] <<  " " ;
     if  ((i + 1) % M == 0) cout << endl;
}
cout << endl;
/*
     ** GPU 計算矩陣相乘
     */
// 創建並初始化 CUBLAS 庫對象
cublasHandle_t handle;
status = cublasCreate(&handle);
if  (status != CUBLAS_STATUS_SUCCESS)
{
     if  (status == CUBLAS_STATUS_NOT_INITIALIZED) {
         cout <<  "CUBLAS 對象實例化出錯"  << endl;
     }
     getchar ();
     return  EXIT_FAILURE;
}
float  *d_A, *d_B, *d_C;
// 在 顯存 中為將要計算的矩陣開辟空間
cudaMalloc(
     ( void **)&d_A,  // 指向開辟的空間的指針
     N*M *  sizeof ( float // 需要開辟空間的字節數
     );
cudaMalloc(
     ( void **)&d_B,
     N*M *  sizeof ( float )
     );
// 在 顯存 中為將要存放運算結果的矩陣開辟空間
cudaMalloc(
     ( void **)&d_C,
     M*M *  sizeof ( float )
     );
// 將矩陣數據傳遞進 顯存 中已經開辟好了的空間
cublasSetVector(
     N*M,  // 要存入顯存的元素個數
     sizeof ( float ),  // 每個元素大小
     h_A,  // 主機端起始地址
     1,  // 連續元素之間的存儲間隔
     d_A,  // GPU 端起始地址
     // 連續元素之間的存儲間隔
     );
cublasSetVector(
     N*M,
     sizeof ( float ),
     h_B,
     1,
     d_B,
     1
     );
// 同步函數
cudaThreadSynchronize();
// 傳遞進矩陣相乘函數中的參數,具體含義請參考函數手冊。
float  a = 1;  float  b = 0;
// 矩陣相乘。該函數必然將數組解析成列優先數組
cublasSgemm(
     handle,  // blas 庫對象
     CUBLAS_OP_T,  // 矩陣 A 屬性參數
     CUBLAS_OP_T,  // 矩陣 B 屬性參數
     M,  // A, C 的行數
     M,  // B, C 的列數
     N,  // A 的列數和 B 的行數
     &a,  // 運算式的 α 值
     d_A,  // A 在顯存中的地址
     N,  // lda
     d_B,  // B 在顯存中的地址
     M,  // ldb
     &b,  // 運算式的 β 值
     d_C,  // C 在顯存中的地址(結果矩陣)
     //
     );
// 同步函數
cudaThreadSynchronize();
// 從 顯存 中取出運算結果至 內存中去
cublasGetVector(M*M,  // 要取出元素的個數
     sizeof ( float ),  // 每個元素大小
     d_C,  // GPU 端起始地址
     1,  // 連續元素之間的存儲間隔
     h_C,  // 主機端起始地址
     // 連續元素之間的存儲間隔
     );
// 打印運算結果
cout <<  "計算結果的轉置 ( (A*B)的轉置 ):"  << endl;
for  ( int  i = 0; i<M*M; i++){
     cout << h_C[i] <<  " " ;
     if  ((i + 1) % M == 0) cout << endl;
}
// 清理掉使用過的內存
free (h_A);
free (h_B);
free (h_C);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
// 釋放 CUBLAS 庫對象
cublasDestroy(handle);
getchar ();
return  0;
}

7 運行結果:

運行結果如下圖所示:

8 注意事項:

注意選擇VS編譯選項為X64


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM