CUDA學習筆記:CUDA Toolkit安裝與專案設定
0 環境
- Win7 32bit
- VS2013
- CUDA Toolkit 6.5
1 下載
2 安裝
只有一個安裝檔案,執行後首先會檢查是否安裝有支援cuda的NVIDIA顯示卡,然後自定義安裝,我用不到3D相關的就都沒選,預設路徑太長,改了一下。CUDA Toolkit: “C:\NVIDIA\CUDA Toolkit”, CUDA Samples: “C:\NVIDIA\CUDA Samples”。然後下一步到安裝完成。我同時裝有VS2008與VS2013,但只有2013可以用,可能是cuda預設配置到高版本中吧。
3 測試
執行CUDA Samples\bin\win32\Release中的deviceQuery.exe程式檢視是否安裝成功以及顯示卡cuda資訊。注意用命令列執行(可以直接拖動檔案到命令列視窗中回車執行),否則結果一閃而過。該程式會輸出CUDA Driver版本、CUDA計算能力、視訊記憶體大小等資訊,最後一行Result = PASS表示通過測試。
對於CUDA Toolkit 7,安裝後Samples只有工程原始碼,沒有可執行檔案,需要自己編譯一下相應工程生成deviceQuery.exe(Samples預設安裝在ProgramData路徑下,找了好久才找到)。
4 高亮
可能是我裝的cuda與vs的版本都比較新吧,cu檔案的語法高亮顯示與函式自動提示並不需要任何配置。(如果是在非cuda runtime專案中,預設只有c++語法部分高亮,但新增cuda的附加依賴項(詳細見後文6.3.3)後,全部均可高亮顯示)
5 cuda工程
- 新建一個cuda runtime工程,會自動生成一個kernel.cu檔案,實現兩個向量相加
- 為了防止閃退,在
main()
函式最後加上getchar()
語句,或者使用system("pause")
,不過後者要加上標頭檔案#include <stdlib.h>
- 如果執行出錯可能是計算能力設定錯誤,專案屬性 -> 配置屬性 -> CUDA C/C++ -> Device -> Code Generation,預設為compute_20,sm_20,我的顯示卡為1.2則改為compute_12,sm_12
- 執行成功則輸出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}
6 C++控制檯工程/MFC工程中使用cuda
二者都是非cuda runtime的工程,配置方法完全一樣,下面以控制檯工程為例說明
- 新建控制檯工程(VC++ -> 常規 -> 空專案)
- 新增cu檔案(這裡使用cuda runtime工程自動生成的模版檔案,即將5中的kernel.cu拷貝到該工程路徑下然後新增),可以新建一個篩選器專門存放cu檔案,這樣檔案較多時看起來比較清楚
cuda配置
- 生成自定義,選中CUDA
- 計算能力設定,見5.3
- 附加依賴項設定,專案屬性 -> 配置屬性 -> 連結器 -> 輸入 -> 附加依賴項,編輯加入cuda runtime工程中的對應內容,具體如下
cudart.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib kernel.cu檔案屬性“項型別”設為 CUDA C/C++
- 生成自定義,選中CUDA
修改kernel.cu檔案,只需要將
main()
函式改為普通函式,如addVec()
。相關程式碼片段如下// …… // 此處main函式改為addVec // int main() int addVec() { const int arraySize = 5; const int a[arraySize] = { 1, 2, 3, 4, 5 }; const int b[arraySize] = { 10, 20, 30, 40, 50 }; int c[arraySize] = { 0 }; // 中間程式碼省略…… if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceReset failed!"); return 1; } getchar(); return 0; } // ……
新增一個cpp檔案,內容如下
extern int addVec(); int main(void) { addVec(); return 0; }
- 編譯執行,應該可以輸出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}了