05cuda

138 阅读3分钟

计算资源分析

线程执行资源分配
  • 线程束本地执行上下文主要资源组成:

    1)程序计数器;

    2)寄存器;

    3)共享内存;

  • SM处理的每个线程束计算所需的计算资源属于片上(on-chip)资源,因此从一个执行上下文切换到另一个执行上下文是没有时间损耗的

  • 对于一个给定的内核,同时存在于同一个SM中的线程块和线程束数量取决于在SM中可用的内核所需寄存器和共享内存数量

  • 每个线程消耗的寄存器越多,则可以放在一个SM中的线程束就越少

  • 如果减少内核消耗寄存器的数量,SM便可以同时处理更多的线程束

  • 一个线程块消耗的共享内存越多,则在一个SM中可以同时处理的线程块就会变少

  • 如果每个线程块使用的共享内存数量变少,那么可以同时处理更多的线程块。

SM占有率

1719560660536.png

当计算资源(如寄存器和共享内存)已分配给线程块时,线程块被称为活跃的块,线程块所包含的线程束被称为活跃的线程束,活跃线程束可分为以下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个线程块。