概述
GPU硬件的核心组件是SM(streaming multiprocess),即流式多处理器。
SM的核心组件包括cuda核心,共享内存,寄存器。SM可以并发的执行数百个线程,并发能力取决于SM所拥有的资源数。
一个线程块只能在一个SM上被调度,SM可以调度多个线程块。
SM采用SIMT(single instruction,multiple thread)单指令多线程架构。基本执行单元是线程束wraps,线程束包含32个线程,这些线程执行相同的指令。从同一程序地址执行,但是据有独立的执行路径和不同的行为。
GPU规定线程束中的所有线程在同一周期内执行相同的指令,线程束分化会导致性能下降。线程块被分到SM时,他将进一步划分为多个线程束wraps,因为线程束是SM的基本执行单元。但是SM并发执行的线程束是有限制的,因为资源限制,SM要为每个线程块分配共享内存,也要为线程束的每个线程分配寄存器。所以SM的配置会影响线程块和线程束的并发数量。
SM的基本执行单元线程束wraps包含32个线程,所以block大小一般设置为32的倍数。
线程协作
硬件对线程块和线程块中的线程都有限制。一般线程块的数量限制为不超过65535,每个线程块中的线程数量不超过设备属性中的maxThreadsPerBlock域值。大多数限制值为每个线程块512个线程。
将CUDA C的关键字__shared__添加到变量声明中,使这个变量驻留在共享内存中。共享内存缓冲区位于GPU上,访问共享内存的延迟远远低于访问CPU上的普通缓冲区。共享内存为线程块内的共享,每个线程块都会产生一个共享变量的副本,因此只需要根据线程块中的线程的数量来分配共享内存。