一、線程模型:Grid、Block、Thread概念
?1. 層級定義?
-
?Thread(線程)?
CUDA中最基本的執行單元,對應GPU的單個CUDA核心(SP)。每個線程獨立執行核函數指令,擁有獨立的寄存器和局部內存空間?。 -
?Block(線程塊)?
由多個線程組成(通常為32的倍數),是邏輯上的并行單元。同一Block內的線程可通過共享內存(Shared Memory)協作,并支持同步操作(如__syncthreads()
)。一個Block內的線程會被劃分為多個?Warp?(32線程為一組,以SIMT方式執行)?。 -
?Grid(網格)?
由多個Block構成,代表完整的核函數執行空間。Grid內的Block可分配到不同SM(流多處理器)上并行執行,但不同Block之間無法直接通信?。
?2. 維度與索引?
-
?維度定義?
Grid和Block均支持一維、二維或三維結構。例如,處理圖像時常用二維Block(如16x16線程)? -
魔方圖
二、索引計算
- ?全局索引?:通過
blockIdx
(Block在Grid中的位置)、threadIdx
(線程在Block中的位置)和blockDim
(Block維度)計算全局位置。例如:int global_x = blockIdx.x * blockDim.x + threadIdx.x; // 一維示例
-
// 二維示例(如圖像處理) int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y;
blockIdx:線程塊在對應 grid 中的編號。
threadIdx:線程在對應線程塊中的編號。
兩者都是uint3向量類型,包含 x, y, z 三個 uint 成員。gridDim:grid 的維度,即每一維的 block 數量。對應調用 kernel 時的 gridSize。
blockDim:block 的維度,即每一維的 thread 數量。對應調用 kernel 時的 blockSize。
兩者都是dim3向量類型,包含 x, y, z 三個 uint 成員。例:
gridDim.x:當前 grid 中線程塊的數量(一維)/