计算资源分析
线程执行资源分配
-
线程束本地执行上下文主要资源组成:
1)程序计数器;
2)寄存器;
3)共享内存;
-
SM处理的每个线程束计算所需的计算资源属于片上(on-chip)资源,因此从一个执行上下文切换到另一个执行上下文是没有时间损耗的
-
对于一个给定的内核,同时存在于同一个SM中的线程块和线程束数量取决于在SM中可用的内核所需寄存器和共享内存数量
-
每个线程消耗的寄存器越多,则可以放在一个SM中的线程束就越少
-
如果减少内核消耗寄存器的数量,SM便可以同时处理更多的线程束
-
一个线程块消耗的共享内存越多,则在一个SM中可以同时处理的线程块就会变少
-
如果每个线程块使用的共享内存数量变少,那么可以同时处理更多的线程块。
SM占有率
当计算资源(如寄存器和共享内存)已分配给线程块时,线程块被称为活跃的块,线程块所包含的线程束被称为活跃的线程束,活跃线程束可分为以下3种类型
-
选定的线程束;
-
阻塞的线程束;
-
符合条件的线程束。
占用率是每个SM中活跃的线程束占最大线程束的比值:
-
占用率=活跃线程束数量/最大线程束数量
-
计算能力8.9为例:
1)一个SM最多拥有的线程块个数为Nb=24;
2)一个SM最多拥有的线程个数为Nt=1536;
-
并行性规模足够大(即核函数执行配置中定义的总线程足够多)的前提下分析SM占有率:
1)寄存器和共享内存使用很少的情况,线程块不小于64(Nt/Nb)时,可以获得100%的占有率;
2)有限寄存器对占有率的影响,当在SM上驻留最多的线程1536个,核函数中每个线程最多使用42个寄存器;
3)有限共享内存对占有率的影响,若线程块大小定义为64,每个SM需要激活24个线程块才能拥有1536个线程,达到100%的利用率每个线程块可分配4.16KB的共享内存。
-
注意:如果一个线程块需要使用的共享内存超过了99KB,会导致核函数无法启动。
-
网格和线程块大小的准则:
1)保持每个线程块中线程数量是线程束大小的倍数
2)线程块不要设计的太小
3)根据内核资源调整线程块的大小
4)线程块的数量要远远大于SM的数量,保证设备有足够的并行
线程束分支
- 线程束分支会降低GPU的并行计算能力,条件分支越多,并行性削弱越严重;
- 线程束分支只发生在同一个线程束中,不同线程束不会发生线程束分化;
- 为获取最佳性能,应避免在同一个线程束中有不同的执行路径;
并行规约计算
- 在向量中满足交换律和结合律的运算,称为规约问题,并行执行的规约计算称为并行规约计算
- 假设要计算4096个元素求和,设计线程块大小为512,每个线程负责一个数据元素,共需8个线程块。