CUDA——设备占用率(occupation)

设备占用率(occupation)

1、公式

设备占有率是用来衡量核函数的配置分配是否是一个高效率的分配方式。
occupation=(active warps)/(max warps)

2、max warps

max warps是每个SM中最多的线程束数量,是一个常量。可以通过查询本机的GPU架构,可知每个SM里最大的可分配的线程数MAX_THREAD_PER_SM(我的机子为2048),以及每个warp包含32个thread。
所以,max warps=MAX_THREAD_PER_SM/32。

3、active warps

active warps是每个SM中的活跃线程束数量,也就是有执行指令,有被warp调度器调度的,

4、限制active warps的因素

在我们现实项目中,经常会出现开启的线程数大于我们的数据量,此时就有很多的线程是处于未激活状态的,这时候active warps小于max warps,占用率下降。空余的线程数越多,占用率越低。所以,线程的大小应该与我们的数据尽量符合。
a、线程数的分配:== 每个块里的线程束应该尽量满足warp大小的倍数==,因为指令的执行是一整个warp去执行的,如果有不足一个warp的线程束去执行指令,那么有些线程就没有被用到,还会占用到资源。
b、SM中寄存器个数:选择合适的寄存器个数,每个线程开启寄存器越多,会使得线程数变少(寄存器大小是固定的),从而使得active warps变少。
c、SM中共享内存大小:跟寄存器差不多一个道理。
d、设备计算能力:决定SM里的资源大小,计算能力越大,资源越大,则不会因为开启多的寄存器或者共享内存导致线程数减少,而使得active warps远低于max warps。

5、设备占用率是否越大越好?

不一定,设备占用率只是衡量你分配线程块的个数,线程个数是否好坏的理论值,并不能直接决定程序性能的好坏。访存和算法优化才是很多程序优化的重点。例如:我可能开了很多共享内存和寄存器,使得我的active warps数量变少,但是我访存的速度加快了,从而使得整个程序性能得到了优化。所以,具体问题要具体分析,看需要解决的大头是什么。== 通常,如果算法上不需要太多的频繁重复访问全局内存,只需要一次读出和写入全局内存,那么设备占用率越大将越有利,因为active warps的增大会隐藏访存延迟。(或者通过添加尽可能多的指令去隐藏)==

最后

CUDA为我们提高一种可以直接计算设备占用率的tools,在你的\NVIDIA GPU Computing Toolkit\CUDA\v10.0\tools里有,要把路径里的版本号进行更换。文件名叫做CUDA_Occupancy_Calculator.xls,是Excel表格,自己可以打开去琢磨。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值