2018年6月18日 星期一

[CUDA]下載及安裝、vs設定

─ 下載
     目前 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 2. 新增一個 CUDA C/C++ File

    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。
3.cudaSetDevice( i ); 則就是設定讓 CUDA driver 去使用第 i 個 device(i 從 0 開始)去做 CUDA 程式的運算。

─ 參考資料:



這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

沒有留言:

張貼留言