總結如下:
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的屬性
-
- 在配置屬性–>常規–>項類型–>選擇“CUDA C/C++”
5 項目配置
5.1 包含目錄配置
- 1.右鍵點擊項目屬性–>屬性–>配置屬性–>VC++目錄–>包含目錄
- 2.添加包含目錄:
$(CUDA_PATH)\include
5.2 庫目錄配置
- 1.VC++目錄–>庫目錄
- 2.添加庫目錄:
$(CUDA_PATH)\lib\x64
5.3 依賴項
-
- 配置屬性–>連接器–>輸入–>附加依賴項
-
- 添加庫文件:
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 端起始地址
1
// 連續元素之間的存儲間隔
);
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 在顯存中的地址(結果矩陣)
M
//
);
// 同步函數
cudaThreadSynchronize();
// 從 顯存 中取出運算結果至 內存中去
cublasGetVector(M*M,
// 要取出元素的個數
sizeof
(
float
),
// 每個元素大小
d_C,
// GPU 端起始地址
1,
// 連續元素之間的存儲間隔
h_C,
// 主機端起始地址
1
// 連續元素之間的存儲間隔
);
// 打印運算結果
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