在 CUDA 中, 以軟體觀點來看, 一個 grid 由許多 block 組成, 一個 block 由許多 thread 組成, 每一個 kernel 函數執行時, 可以從 threadIdx 與 blockIdx 取得編號, 但是並沒有 gridIdx, 這表示每一個平行處理的執行, 是在同一個 grid 下進行. BlockSize 與 ThreadSize 的數量受限於 GPU 的硬體架構, 平行處理的函數呼叫語法是:

    函數名稱 < << BlockSize, ThreadSize>> > (函數參數)

CUDA的執行, 保證兩件事:

 1. 同一個 block 內的所有 thread, 會在同一個 SM (Stream Multiprocessor) 被同時執行.

 2. 在任何下一個 kernel的block執行前, 會把目前 kernel 內的所有block執行完畢.

以下簡單的 CUDA 專案, 用來觀察執行的情形, CUDA 的同步機制, 會在一個Block執行完畢後才換另一個Block, 但是 Block 之間並沒有特定順序. 這個簡單的例子, 因為printf輸出占用同一個輸出資源的關係, 看起來Block內的Thread有照順序執行, 但是無法保證一定會這樣, 因為每個Thread實際上是同時被執行.

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void hello()

{

     printf("This is thread %d in block %d\n", threadIdx.x, blockIdx.x);

}

int main()

{

      int blockSize =4, threadSize = 3;

       // running in parallel

    hello << <blockSize, threadSize >> > ();

 

      //force the printf to flush

   cudaDeviceSynchronize();

   getchar(); //wait keypressed

     return 0;

}

 

執行結果:

undefined

arrow
arrow
    全站熱搜

    ghostyguo 發表在 痞客邦 留言(0) 人氣()