CUDA-更新线程ID

更新 thread ID

当数据个数 ≥ CUDA core 个数时,thread id 不用更新,一次同时习性完。

如我有2024个数据,而我的GPU每次可分配2048个threads。我的kernel配置<<<1, 2048>>>,那么2024个数据可以被2024个threads一次执行完毕,其中有24个threads空闲,因为因为没有多余的数据去处理。

如果还是2024个数据,而我的GPU只允许用户一次配置512个threads。我的kernel配置是<<<1, 512>>>,一次是不能把数据全部处理完的。当第一次处理完后,还要3次threads的id更新,最后一次有24个threads空闲,因为没有多余出具需要被处理。

kernel代码片段如下:

1
2
3
4
5
int id = threadIdx.x + blockDim.x * blockIdx.x;
while(id < N){
// TODO excute operation
id += blockDIm.x * gridDim.x;
}

其中while()判断当前thread的id需要更新多少次。

  • 对于<<<1, 2048>>>的kernel,处理2024个数据,其中N=2024。假如其中一个thread的起始id为0,干完活后,判断0<2024,所以这个thread的id会被跟新为2048,此时再判断2048<2024,返回false,这个thread的工作结束。thread的id未被更新。

  • 对于<<<1, 512>>>的kernel,处理2024个数据, 其中N=2024。
    仍假如有一个thread是起始id为0,判断0<2024,执行操作。所以跟新id为512;
    判断512<2024,执行操作,再更新id为1024;
    判断1024<2024,执行操作,再更新id为1536;
    判断1536<2024,执行操作,再更新id为2048;
    判断2048<2024,返回false。该thread的工作结束。

期间这个thread的id被更新了4次,第4次更新玩后,并无操作。

Matrix Transpose 理解id更新