CUDA Occupency讨论
今天来谈一下 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