更新 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 | int id = threadIdx.x + blockDim.x * blockIdx.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次更新玩后,并无操作。