CUDA程式設計二(CUDA初始化)

CUDA初始化與核函式

CUDA初始化

CUDA安裝成功之後,新建一個工程還是十分簡單的,直接在新建專案的時候選擇NVIDIA CUDA專案就可以了,我們先新建一個cuda工程,刪掉自帶的示例kernel.cu,然後新建項,新建一個CUDA C/C File ,我們首先看一下如何初始化CUDA,因此我命名為initcuda.cu

1.首先我們要使用CUDA的RunTime API 所以 我們需要include cuda_runtime.h

#include <stdio.h> 
//CUDA RunTime API
#include <cuda_runtime.h>

2.接下來這個函式會呼叫 runtime API 中 有關初始化CUDA的內容

//CUDA 初始化
bool InitCUDA()
{
int count;
//取得支援Cuda的裝置的數目
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 的GPU的數量,如果計算機上沒有支援 CUDA 的裝置,則會傳回 1,而這個1是device 0 ,device0 只是一個模擬裝置,但是CUDA的很多功能都不支援(不支援CUDA1.0以上版本),因此我們要真正確定系統上是否有支援CUDA的裝置,需要對每個device呼叫cudaGetDeviceProperties,來獲得它們的具體引數,以及所支援的CUDA版本(prop.major 和 prop.minor 分別代表裝置支援的版本號碼,例如
6.5 則 prop.major 為 6 而prop.minor 為 5)

cudaGetDeviceProperties除了可以獲得裝置支援的 CUDA 版本之外,還有裝置的名稱、記憶體的大小、最大的 thread 數目、執行單元的頻率等等。詳情可參考NVIDIA 的 CUDA Programming Guide。

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

下面我們在Main函式中呼叫InitCUDA函式,由於我們使用VS,所以直接ctrl F5編譯執行就可以了,執行時如果系統上有支援 CUDA 的裝置,應該會顯示 CUDA initialized。

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