一个grid中的所有线程执行相同的内核函数,通过坐标进行区分。这些线程有两级的坐标,blockId和threadId,由CUDA runtime system指定。grimDim.x标识block在x维度上的数目,gridDim.y标识block在y维度上的数目。例如,
在启动内核时指定:
注意:一个block最多能有512个线程。
如果kernel function没有用到blockId,那么所有的线程都属于同一个block。
例如:
P=M* N,那么:Pd[Row][Col]=Sum{ Md[Row][k]*Nd[k][Col] }
同一个block中的线程通过syncthreads()进行同步。当内核函数调用syncthreads()时,block中的所有线程都在调用位置停留,直到block中的其他线程达到这个位置。Barrier synchronization是常用的协调线程并行行为的方法。
这样的话,同样的程序,可以以多种不同的方式执行。每种执行方式可能有不同的开销,功耗和性能。例如,一个mobile processor可以以很低的功耗慢速执行,一个desktop processor可以以高一些的功耗快速执行。程序相同,但是这种改变是透明的。
线程分配
线程调度