CUDA Occupency讨论

adagio_chen 2014-08-24 08:42:36
加精
今天来谈一下 CUDA 编程中的 occupancy 问题

什么是 occupancy?
Occupancy 被定义为“active threads数量“与“max active threads数量“之比。这里的数量都是指在一个流处理器(SM)上的。

为什么要关心 occupancy?
因为理论上来说,在一个SM上,活动线程数量多,就越有利与指令流水化以及覆盖访存延迟,从而提高程序的效率。实际上来说(按照手册上的说法),occupancy 达到70%以上基本上就可以了。

occupancy 和什么参数相关?
1. block的大小。
2. 寄存器的使用。
3. 共享内存的使用。

以最新的Maxwell架构为例,单个SM上,max active threads=2048,max active blocks=32,可以分配65536个寄存器,以及64K共享内存。

block的大小:
如果一个block有32个线程,那么active threads = 32 * 32 = 1024, 因此,这个时候 occupancy = 1024 / 2048 = 50%
如果一个block有64个线程,那么active threads = 32 * 64 = 2048, 因此,这个时候 occupancy 可以达到100%。由此可知,对于Maxwell架构来说,每个block至少应该要有64个thread以上。

寄存器的影响:
如果一个thread使用了64个寄存器,那么一个SM上最多可以拥有 65536 / 64 = 1024 个active threads ,因此,这个时候 occpancy = 1024 / 2048 = 50%
如果一个thread使用了32个寄存器,那么一个SM上最多可以拥有 65536 / 32 = 2048 个active threads ,因此,这个时候 occupancy = 100%。由此可知,每个thread的寄存器数量尽量不超过32。

共享内存的影响:
如果一个block有64个threads,并且分配了4K共享内存,于是一个SM上最多拥有16个活动block,也就是64 * 16 = 1024个threads。因此这个时候 occpancy = 1024 / 2048 = 50%。由此可知,使用过多的共享内存会降低occpancy

以上的技术分析只是从 occpancy 的角度出发的,实际上提高程序效率的方法有很多,occpancy 只是其中之一。并且低occupancy 也并不一定导致低效率。有兴趣的可以参考一下这篇文章:Better Performance at Lower Occupancy
http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf


...全文
702 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dios123 2014-08-25
  • 打赏
  • 举报
回复
有道理,block的大小,寄存器的使用和共享内存的使用都与occupancy相关
hugh_z 2014-08-25
  • 打赏
  • 举报
回复
learning
GW786228836 2014-08-25
  • 打赏
  • 举报
回复
YCMyTot 2014-08-25
  • 打赏
  • 举报
回复
学习了,谢谢版主的分享!
hugh_z 2014-08-24
  • 打赏
  • 举报
回复
learning

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧