─ 下載
目前 NVIDIA 提供的 CUDA Toolkit(可從 https://developer.nvidia.com/cuda-downloads 下載)支援 Windows (32 bits 及 64 bits 版本)及許多不同的 Linux 版本。
上圖是Nvidia cuda toolkit 下載的頁面,請依自己的作業系統選擇即可,最下面 「Installer Type」 是指安裝的方式:「exe(network)」是指網路開著,所有安裝的東西就是一邊安裝一邊下載,所以安裝檔的容量比較小;「exe(local)」是指把所有要安裝的東西一次下載完,所以檔案比較大,筆者是選擇local的。
安裝的話非常簡單,雙擊執行檔,並一直按「下一步」就可以了。順帶一提,安裝的時候最好一直放著讓它安裝,因為是選擇「快速安裝」,所以程式會偵測安裝者的驅動版本,並決定是否要安裝最新版的。
安裝結束後,在
●CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.1
●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
在「C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.1」的資料夾中,有許多cuda的範例可以參考,而且還有VS的專案檔(.sln),雙擊兩下後即可打開,不過它只有 VS 2010 ~ VS 2017的而已,若是太舊的VS就不能開了。
─ visual studio 2015引用cuda
Step 1. 先開一個win 32的空專案,筆者命名為Test_CUDA_Function。
Step 3. 設定cuda組件的相依性,請在方案總管中的專案名稱按右鍵 -> 組建相依性 -> 組建自訂,並選擇 CUDA 9.1(.targets, .prop)
Step 4. .cu檔的屬性配置,在main.cu檔上按右鍵 -> 屬性,在「項目類型」的項目中選「CUDA C/C++」
Step 5. 其他的屬性配置,在專案名稱的地方按右鍵 -> 屬性。
VC++ 目錄 -> 其他include目錄,加上 「$(CUDA_PATH)\include」。
VC++ 目錄 -> 程式庫目錄,加上「$(CUDA_PATH)\lib\x64」
連結器 -> 其他相依性,加入以下 .lib檔:
cublas.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
nvcuvid.lib
OpenCL.lib
注意:若是編譯平台為 x86,程式庫目錄的地方要改成「$(CUDA_PATH)\lib\Win32」,因為x64及x86的函式庫不一樣,其餘的設定是一樣的,.lib檔的名稱也是一樣的。
─ 測試的程式碼
#include "cuda_runtime.h"
#include "cublas_v2.h"
#include <iostream>
bool InitCUDA()
{
int count;
cudaGetDeviceCount(&count);
if (count == 0)
{
fprintf(stderr, "There is no device.\n");
return false;
}
int i;
for (i = 0; i < count; i++)
{
cudaDeviceProp prop;
if (cudaGetDeviceProperties(&prop, i) == cudaSuccess)
{
if (prop.major >= 1)
{
break;
}
}
}
if (i == count)
{
fprintf(stderr, "There is no device supporting this CUDA version.\n");
return false;
}
cudaSetDevice(i);
return true;
}
void main()
{
if (!InitCUDA())
{
printf("CUDA initialized failure.\n");
}
printf("CUDA initialized.\n");
system("pause");
}
程式碼解說[4]:
1. 上面的程式碼中,cudaGetDeviceCount 其完整定義為 cudaError_t cudaGetDeviceCount ( int * count ) 。若 count 的回傳值大於第於1,即代表該電腦有gpu;若 count 的回傳值為0或cudaGetDeviceCount 的回傳值為1,即代表該電腦不支援cuda。
2.cudaError_t cudaGetDeviceProperties ( struct cudaDeviceProp * prop, int device ) 是用來回傳第幾個gpu的特性,device就是指gpu;prop是其特性,cudaDeviceProp 的成員的部分可以到nvidia的官網查( https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__DEVICE_g5aa4f47938af8276f08074d09b7d520c.html )。順帶一提,device的上限就是 cudaGetDeviceCount 回傳出的count。
2.cudaError_t cudaGetDeviceProperties ( struct cudaDeviceProp * prop, int device ) 是用來回傳第幾個gpu的特性,device就是指gpu;prop是其特性,cudaDeviceProp 的成員的部分可以到nvidia的官網查( https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__DEVICE_g5aa4f47938af8276f08074d09b7d520c.html )。順帶一提,device的上限就是 cudaGetDeviceCount 回傳出的count。
3.cudaSetDevice( i ); 則就是設定讓 CUDA driver 去使用第 i 個 device(i 從 0 開始)去做 CUDA 程式的運算。
─ 參考資料:
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote |
沒有留言:
張貼留言