blockIdx是一個uint3類型,表示一個線程塊的索引,一個線程塊中通常有多個線程
blockIdx.x是塊在X方向上的索引,
blockIdx.y是塊在Y方向上的索引,
threadIdx.x是線程在X方向上的索引(在自己的線程塊內),
threadIdx.y是線程在Y方向上的索引,
blockDim是一個dim3類型,表示線程塊的大小。
blockDim.x是塊在X方向上的線程數(shù),(在X方向上每一塊有多少個線程)
blockDim.y是塊在Y方向上的線程數(shù),(在Y方向上每一塊有多少個線程)
gridDim.x表示x方向有幾個block
使用N個線程塊,每一個線程塊只有一個線程,即
dim3 dimGrid(N);
dim3 dimBlock(1);
此時的線程號的計算方式就是
threadId = blockIdx.x;
使用一個線程塊,該線程具有N個線程,即
dim3 dimGrid(1);
dim3 dimBlock(N);
此時線程號的計算方式為
threadId = threadIdx.x;
使用M×N個線程塊,每個線程塊1個線程
由于線程塊是2維的,故可以看做是一個M*N的2維矩陣,其線程號有兩個維度,即
dim3 dimGrid(M,N);
dim3 dimBlock(1);
其中
blockIdx.x 取值0到M-1
blcokIdx.y 取值0到N-1
pos = blockIdx.y * blcokDim.x + blockIdx.x;---線程序列號是從上到下后從左到右
使用M個線程塊,每個線程塊內含有N個線程,即
dim3 dimGrid(M);
dim3 dimBlock(N);
這種情況,可以把它想象成二維矩陣,矩陣的行與線程塊對應,矩陣的列與線程編號對應,那線程號的計算方式為
threadId = threadIdx.x + blcokIdx*blockDim.x;------------簡單地,只需要在x方向上做計算
使用M×N的二維線程塊,每一個線程塊具有P×Q個線程,即
dim3 dimGrid(M, N);
dim3 dimBlock(P, Q);
其索引有兩個維度
threadId.x = blockIdx.xblockDim.x+threadIdx.x;
threadId.y = blockIdx.yblockDim.y+threadIdx.y;
變量類型限定符:用來確定某個變量在設備上的內存位置
device表示位于全局內存空間,默認類型
share表示位于共享內存空間
constant表示位于常量內存空間
texture表示其綁定的變量可以被紋理緩存加速訪問