建议先看看前言中关于存储器的介绍:点击打开链接
线程
首先介绍进程,进程是程序的一次执行,线程是进程内的一个相对独立的可执行的单元。若把进程称为任务的话,那么线程则是应用中的一个子任务的执行。举个简单的例子:一个人要做饭,食谱就是程序代码,做的过程就是执行程序,做好的饭就是程序运行的结果,而在这期间,需要炒菜,放盐,放油等等就是线程。
线程同步
调用__syncthreads 创建一个 barrier 栅栏
每个线程在调用点等待块内所有线程执行到这个地方,然后所有线程继续执行后续命令
Mds[i] = Md[j];
__syncthreads();
func(Mds[i],Mds[i+1]);
要求线程的执行时间尽量接近,因为执行时间差别过大,等待时间过长,效率低下。
只在块内同步,全局同步开销大
线程同步会导致死锁,例如:
if(someFunc())
{
__syncthreads();
}
else
{
__syncthreads();
}
线程调度
Warp——块内的一组线程,一般是32个线程为一组
线程调度的基本单位
运行于同一个 SM(流多处理器)
内部threadIdx值连续
warp内部线程不能沿不同分支执行
线程层次
Grid——一维或多维线程块(block)
一维或二维
Block——一组线程
一维,二维或三维
一个 Grid 里的每个 Block 的线程数是一样的
block内部的内个线程可以同步(synchronize)和访问共享存储器(shared memory)
线程组织模型
block下由线程束(warp) 组成,block 内部的线程共享