2016年9月9日 星期五

CUDA C入門摘要

CUDA C 指的其實是 CUDA C/C++

host指的是主機CPU端
device指的是GPU端



CUDA C程式的典型流程
1. Declare and allocate host and device memory.
宣告並指派主機端與CPU端記憶體
2. Initialize host data.
初始化主機端資料
3. Transfer data from the host to the device.
將資料從主機端傳到GPU
4. Execute one or more kernels.
在1/多個核心上計算
5. Transfer results from the device to the host.
將結果從GPU傳回主機

1. device上的記憶體指標多會加前綴 d_,並以cudaMalloc()指派
int * d_a;
cudaMalloc(&d_a, N*sizeof(int));   //在device上面allocate N個int

3. 將host上面初始化完成的資料複製到device上,cudaMemcpy()
cudaMemcpy(d_a, a, N*sizeof(int), cudaMemcpyHostToDevice);

4.
指定(啟動)運算使用的核心
saxpy<<<(N+255)/256, 256>>>(N, d_a, d_b);      //執行device code saxpy()
在<<<與>>>之間的資訊指定運算的核心數
第一個變數指定thread block的數目,後一個變數指定每個thread block中的threads數。這兩個變數都可以是三維的(以CUDA C定義的簡單結構dim3傳入)。如果元素個數不能被threads數整除,需要檢查元素的取用是否在有效範圍內。

__global__                                                  //表示為device code
void saxpy(int n, float *a, float *b)
{
  int i = blockIdx.x*blockDim.x + threadIdx.x;          //計算應該處裡的元素
  if (i < n)                                 //檢查元素能否取用
        b[i] = a[i] + b[i];
}

gridDim,blockDim, blockIdx和threadIdx是CUDA預先定義的dim3 type變數。
blockDim與啟動核心時傳入的第二個變數相同(在範例中是256)

5.將運算完成的資料複製到host,cudaMemcpy()
cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);


參考文章:An Easy Introduction to CUDA C and C++

沒有留言:

張貼留言