0
点赞
收藏
分享

微信扫一扫

CUDA占用率计算方法

sullay 2022-01-06 阅读 91

通常认为:一个SM中所有的线程在同时工作,那么这个SM的效率或占用率就是100%,在这种情况下,处理程序的速度是最快的,效率是最高的。如果实际中由于资源的限制(如共享内存,寄存器),不是所有的线程都同时工作,这时,称正在运行的线程为活跃(actived)或常驻(resident)线程。占用率一般受三个条件的限制:
1.SM最大并发线程数,SM最大并发Warp数,SM最大并发块数
2.共享内存资源限制
3.寄存器资源限制

每个SM是GPU处理数据的最基本单元,它们运行都是独立并行的,SM的数量通常最直观地体现了GPU硬件的能力。

程序具体参数的设置可以在一些工具的帮助下进行,CUDA安装目录有个tools的文件夹,文件夹中有一个CUDA Occupancy Calculator的excel文件。把表格中硬件参数加入进去,就可以自动计算出来相应的程序运行参数。

 

1、占用率公式:每个SM中活跃线程束的数量/每个SM中最大的线程束的数量。可以看到我的设备每个SM中最大线程束是32固定的,所以现在问题变为活跃线程束为什么是20。粉色圈中的部分的最小值才是决定占用率的因素,所以可以看到占用率是由上图中粉色圈中的寄存器因素计算而来。寄存器因素显示:(每个SM有10个活跃blocks)*(每个block有2个线程束)=20.(所以占用率公式的分子即活跃线程束的数量就是这样来的)。

2、所以现在变为寄存器因素中每个SM中活跃blocks为什么是10。也就是浅蓝色C为什么是10。易知,C=B/A。所以此时问题变为A为什么==2,B为什么==20。

3、我查看了下A的公式:=IF(myAllocationGranularity="block",CEILING(CEILING(MyWarpsPerBlock,myWarpAllocationGranularity)*MyRegCount*limitThreadsPerWarp,myAllocationSize),MyWarpsPerBlock)  而绿色圈中显示寄存器分配粒度不是"block",而是warp,所以此时A=myWarpsPerBlock=64/32=2

4、我查看了下B的公式:

=IF(myAllocationGranularity="block",limitRegsPerBlock,FLOOR(limitRegsPerBlock/CEILING(MyRegCount*limitThreadsPerWarp,myAllocationSize),myWarpAllocationGranularity))  而绿色圈中显示寄存器分配粒度不是"block",而是warp,所以此时B=FLOOR(limitRegsPerBlock/CEILING(MyRegCount*limitThreadsPerWarp,myAllocationSize),myWarpAllocationGranularity) 代入我紫色圈中的设置数值后:

 

所以到此为止,就知道ABC三处是怎么计算的了。

参考文献:CUDA Occupancy Calculator中计算占用率_wd1603926823的专栏-CSDN博客_cuda占用率计算

 

 

举报

相关推荐

0 条评论