NVIDIA CUDA 程式設計模型允許靈活地配置 grid 和 block,使程式能夠在不同規模和結構上執行。CUDA 中的 grid 可以是 1、2 或 3 維的,block 也可以是 1、2 或 3 維的。這意味著存在多種可能的組合,每種組合都會影響最終執行緒的編號計算。下表展示了所有可能的 grid 和 block 組合,並描述瞭如何計算執行緒的全域性編號。
1,CUDA grid 和 block 組合
1DGrid/1DBlock 單個 block/threadIdx.x + blockIdx.x * blockDim.x
1DGrid/2DBlock 線性 block/(threadIdx.x + threadIdx.y * blockDim.x) + blockIdx.x * (blockDim.x * blockDim.y)
1DGrid/3DBlock 線性 block/(threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y) + blockIdx.x * (blockDim.x * blockDim.y * blockDim.z)
2DGrid/1DBlock 線性 grid/threadIdx.x + (blockIdx.x + blockIdx.y * gridDim.x) * blockDim.x
2DGrid/2DBlock 雙重/(threadIdx.x + threadIdx.y * blockDim.x) + (blockIdx.x + blockIdx.y * gridDim.x) * (blockDim.x * blockDim.y)
2DGrid/3DBlock 雙重/(threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y) + (blockIdx.x + blockIdx.y * gridDim.x) * (blockDim.x * blockDim.y * blockDim.z)
3DGrid/1DBlock 三重/(threadIdx.x + (blockIdx.x + blockIdx.y * gridDim.x + blockIdx.z * gridDim.x * gridDim.y) * blockDim.x
3DGrid/2DBlock 三重/(threadIdx.x + threadIdx.y * blockDim.x) + (blockIdx.x + blockIdx.y * gridDim.x + blockIdx.z * gridDim.x * gridDim.y) * (blockDim.x * blockDim.y)
3DGrid/3DBlock 三重/(threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y) + (blockIdx.x + blockIdx.y * gridDim.x + blockIdx.z * gridDim.x * gridDim.y) * (blockDim.x * blockDim.y * blockDim.z)
2, 解釋:
1. Grid 維度:可以是 1D、2D 或 3D。
2. Block 維度:可以是 1D、2D 或 3D。
3. 計算方式:描述瞭如何線上性化 grid 和 block 索引以計算全域性執行緒編號。
4. 執行緒編號計算公式:根據不同的 grid 和 block 維度組合,計算每個執行緒的全域性編號。這些公式通常用來訪問全域性記憶體或者分配任務。
3, 總結:
這張表列舉了所有可能的 grid 和 block 維度組合以及相應的全域性執行緒編號計算公式。這些計算方法在 CUDA 程式設計中非常重要,因為它們決定了每個執行緒如何處理資料。透過不同的組合,你可以最佳化程式效能並最大化 GPU 資源的利用。