1. 程式人生 > >CUDA學習筆記:CUDA Toolkit安裝與專案設定

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工程

  1. 新建一個cuda runtime工程,會自動生成一個kernel.cu檔案,實現兩個向量相加
  2. 為了防止閃退,在main()函式最後加上getchar()語句,或者使用system("pause"),不過後者要加上標頭檔案#include <stdlib.h>
  3. 如果執行出錯可能是計算能力設定錯誤,專案屬性 -> 配置屬性 -> CUDA C/C++ -> Device -> Code Generation,預設為compute_20,sm_20,我的顯示卡為1.2則改為compute_12,sm_12
  4. 執行成功則輸出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}

6 C++控制檯工程/MFC工程中使用cuda

二者都是非cuda runtime的工程,配置方法完全一樣,下面以控制檯工程為例說明

  1. 新建控制檯工程(VC++ -> 常規 -> 空專案)
  2. 新增cu檔案(這裡使用cuda runtime工程自動生成的模版檔案,即將5中的kernel.cu拷貝到該工程路徑下然後新增),可以新建一個篩選器專門存放cu檔案,這樣檔案較多時看起來比較清楚
    專案結構
  3. cuda配置

    1. 生成自定義,選中CUDA
      生成自定義 這裡寫圖片描述
    2. 計算能力設定,見5.3
    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

    4. kernel.cu檔案屬性“項型別”設為 CUDA C/C++

  4. 修改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;
    }
    // ……
  5. 新增一個cpp檔案,內容如下

    extern int addVec();
    
    int main(void)
    {
        addVec();
        return 0;
    }
  6. 編譯執行,應該可以輸出{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}了
    執行結果