【CUDA】占用率计算

最近在用CUDA做算法的性能优化,研究了一下影响CUDA性能的诸多因素。其中占用率是衡量流处理器(SM)上活跃线程束比例的重要参数,计算公式是每个SM中活跃线程束的数量/每个SM中最大的线程束的数量。要计算占用率,其实就是计算一个SM上最多能放几个block,或者几个warp,分别要从寄存器和共享内存两个方面计算。

寄存器:每个线程需要的寄存器大小已知(如果不知道可以nvvp跑一下,看看核函数占用的寄存器大小),然后乘以warpsize(一般为32)就得到一个warp的寄存器大小。注意寄存器最小分配单元为256(查表),也就是说一个warp的寄存器数应该为256的倍数。一个SM上总寄存器大小是固定的(一般65536),用这个值除以一个warp的寄存器数就能得到一个SM上最多放多少warp(Warps/SM)。这里还要注意warp分配的最小粒度是4(查表),也就是说一个Warps/SM应该是4的倍数,需要向下取整。下面举例说明:
请添加图片描述

例1:如果一个block上256个线程,线程寄存器47,那一个warp需要寄存器大小47×32=1504,所以一个warp分配1536个寄存器(256的倍数)。那么一个SM最多能放65536/1536=42.7个warp,取40(4的倍数)。
请添加图片描述

例2:如果一个block上128个线程,线程寄存器133,那一个warp需要寄存器大小133×32=4256,所以一个warp分配4352个寄存器(256的倍数)。那么一个SM最多能放65536/4352=15.1个warp,取12(4的倍数)。

共享内存:一个SM上共享内存大小是固定的(一般65536),所以只要直到一个block需要多少共享内存,就知道一个SM能放多少block了。如一个block需要1000bytes共享内存,那会为每一个block分配1024bytes共享内存(最小分配粒度是256,查表)那一个SM的block最多为floor(65536/1024)=64个(仅为理论上界)。

英伟达提供了CUDA占用率计算器,在CUDA安装路径tools目录下。一开始打开这个文件有点头晕,后来主要参考了这篇文章慢慢理解了一些。其实在这个excel里我们只需要输入几个数就能求出占用率和各项资源对占用率影响的图,也不需要知道它是怎么算的,但这里还是深究一下。在第一个表格的绿色部分输入CUDA计算能力和分配的共享内存大小。橙色部分输入需要的计算资源,包括每个block线程数、每个线程寄存器大小和每个block共享内存。蓝色部分是每个SM线程、线程束、block数量和占用率的计算结果。灰色部分是GPU的基本信息。然后重点介绍一下下面两个黄色部分。
分配资源(Allocated Resources)这个表是每一种资源单独算出的每个SM上block数(Blocks/SM)。对于第一行Warps,每个block的warp数(Per Block)为每个block的线程数除以warpsize(向上取整,最少为1)。比如我一个block128个线程,就是4个warp,而100个线程呢,还是4个warp,因为warpsize是线程分配的最小单元了,不能拆分,必须分配128个,剩下的28个不激活。每个SM的warp数(Limit Per SM)是固定的,看计算能力。这两者相除就得到了每个SM的block数(Blocks Per SM),向下取整。对于第二行,Per Block等于Warps的Per Block,因为寄存器分配的最小粒度是warp,一个block有多少warp就有多少寄存器。Limit Per SM的计算上面已经说了,同理两者一除就得到Blocks Per SM了。第三行Shared Memory上面说了,也同理。
每个SM上的最大block数(Maximum Thread Blocks Per Multiprocessor)这个表是用各种方法计算出的Blocks/SM的瓶颈所在,用红色标出。如果第一行为红色那就没办法了,硬件限制,你的程序没有优化空间(上面例1)。如果后面两行为红的话可以考虑减小寄存器(上面例2)或共享内存来尝试优化。然后瓶颈的Blocks/SM乘Warps/Block就得到Warps/SM了,这个值最大是多少取决于计算能力,一除就是占用率了。

另外NVIDIA Nsight Compute也可以查看核函数的占用率,今后学一下。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值