在 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; } |
執行結果:
留言列表