技术开发 频道

第一個 CUDA 程式

  【IT168 文档】CUDA 目前有兩種不同的 API:Runtime API 和 Driver API,兩種 API 各有其適用的範圍。由於 runtime API 較容易使用,一開始我們會以 runetime API 為主。

  CUDA 的初始化

  首先,先建立一個檔案 first_cuda.cu。如果是使用 Visual Studio 的話,則請先按照這裡的設定方式設定 project。

  要使用 runtime API 的時候,需要 include cuda_runtime.h。所以,在程式的最前面,加上

#include <stdio.h>
#include
<cuda_runtime.h>

  接下來是一個 InitCUDA 函式,會呼叫 runtime API 中,有關初始化 CUDA 的功能:

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 CUDA 1.x.\n");
        
return false;
    }
    cudaSetDevice(i);
    
return true;
}

  這個函式會先呼叫 cudaGetDeviceCount 函式,取得支援 CUDA 的裝置的數目。如果系統上沒有支援 CUDA 的裝置,則它會傳回 1,而 device 0 會是一個模擬的裝置,但不支援 CUDA 1.0 以上的功能。所以,要確定系統上是否有支援 CUDA 的裝置,需要對每個 device 呼叫 cudaGetDeviceProperties 函式,取得裝置的各項資料,並判斷裝置支援的 CUDA 版本(prop.major 和 prop.minor 分別代表裝置支援的版本號碼,例如 1.0 則 prop.major 為 1 而 prop.minor 為 0)。

  透過 cudaGetDeviceProperties 函式可以取得許多資料,除了裝置支援的 CUDA 版本之外,還有裝置的名稱、記憶體的大小、最大的 thread 數目、執行單元的時脈等等。詳情可參考 NVIDIA 的 CUDA Programming Guide。

  在找到支援 CUDA 1.0 以上的裝置之後,就可以呼叫 cudaSetDevice 函式,把它設為目前要使用的裝置。

  最後是 main 函式。在 main 函式中我們直接呼叫剛才的 InitCUDA 函式,並顯示適當的訊息:

int main()
{
    
if(!InitCUDA()) {
        
return 0;
    }
    printf(
"CUDA initialized.\n");
    
return 0;
}

  這樣就可以利用 nvcc 來 compile 這個程式了。使用 Visual Studio 的話,若按照先前的設定方式,可以直接 Build Project 並執行。

  nvcc 是 CUDA 的 compile 工具,它會將 .cu 檔拆解出在 GPU 上執行的部份,及在 host 上執行的部份,並呼叫適當的程式進行 compile 動作。在 GPU 執行的部份會透過 NVIDIA 提供的 compiler 編譯成中介碼,而 host 執行的部份則會透過系統上的 C++ compiler 編譯(在 Windows 上使用 Visual C++ 而在 Linux 上使用 gcc)。

  編譯後的程式,執行時如果系統上有支援 CUDA 的裝置,應該會顯示 CUDA initialized. 的訊息,否則會顯示相關的錯誤訊息。

0
相关文章