2018年8月24日 星期五

[CUDA] 平行處理基礎 : Block 與 Thread

在 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;
}


執行結果:

沒有留言:

張貼留言