Occupancy的定义:活动的warp数量与最大数量的比值。
意义:GPU的硬件利用率,利用率越高不一定性能就越高,但如果利用率很小,性能肯定不会好。这很好理解,一条马路,利用率太高了,如拥堵,说明车流量太大马路容量(承载能力)不足够了;利用率太低了,则没有充分利用到交通资源,此时无法体现马路的承载能力。
同一时刻,GPU的每个SM运行着若干个block,sm会根据block的线程数为其分配寄存器:
每个block分配到的寄存数量=每个线程所需的寄存器数量*线程数。
但是每个SM的寄存器数目是有限的,如果每个block的线程数越多(所需的寄存器数量也多),block的数量就会越少。block的数量减少,会导致SM的占用率降低!
举例说明:cc=1.1,SM的最大寄存器数量为8192,假设128-thread block,12-reg thread,此时只能运行5个block(8192/12/128 = 5.333),Occupancy=5*128/768=83.33%
注意:768是cc 1.1的每个SM的最大线程数
假设256-thread block,12-reg thread,此时只能运行2个block(8192/12/256=2.67),
Occupancy=2*256/768=66.67%
CUDA的toolkit提供了一个CUDA Occupancy Calculator工具,用于计算不同cc和block分配下的Occupancy
这是一个excel表格,放在\NVIDIA GPU Computing Toolkit\CUDA\v8.0\tools目录下
Occupancy只能是评估性能的一个方面,并不是所有情况下都是越高越好