7.4_占用率
7.4 占用率
占用率(Occupancy)指的是在一个给定的内核启动内,SM中运行的线程数与其可容纳的最大线程数的比值。
每SM包含的线程束数目每SM可容纳的最大线程束数目
该表达式的分母(每个SM中线程束的最大数目)是一个常数,仅由设备的计算能力决定。而式中的分子则决定了占用率的大小,为下列各项的函数。
• 计算能力(1.0,1.1,1.2,1.3,2.0,2.1,3.0,3.5);
每个线程块中的线程;
每个线程的寄存器;
·共享内存配置 [1];每个线程块的共享内存。
为了帮助开发者评估这些参数之间的权衡,CUDA工具包以Excel电子表格[2]的形式包含了一个占用率计算器。如果提供以上的输入,电子表格将会对如下各项进行计算。
活跃线程数;
· 活跃线程束数;
· 活动线程块数;
· 占用率(活跃线程束数目除以硬件可支持的线程束的最大数目)。
该电子表格还可以识别是哪个参数限制了占用率。
每个SM中的寄存器;
每个SM中线程束或线程块的最大数量;
每个SM的共享内存。
请注意,占用率并不是CUDA性能的全部或者终结 [3]。通常,更多地使用每个线程中的寄存器和依靠指令级并行(ILP)可以提升性能。在讨论线程束和占用率的权衡方面,英伟达公司已经作出很好的陈述 [4]。
在第5.2.10小节的代码清单5-5中,给出了一个低占用率的内核却实现近乎全局内存最大带宽的例子。GlobalReads内核的内部循环可以根据一个模板参数展开。随着展开的迭代次数的增加,所需的寄存器数目会增加,且占用率会下降。例如,对于实例cg1.4xlarge下的
Tesla M2050,读取带宽的峰值显示(ECC禁用下)为124GiB/s,占用率却只有 。VolRov报告了内核的占用率不到 ,却实现接近峰值的内存带宽。
[1] 仅对应于 SM 2.x 或更高级的版本。开发者可以将 SM 中 64KB 的一级缓存分为 16KB 的共享内存与 48KB 的一级缓存,抑或是 48KB 的共享内存与 16KB 的一级缓存(SM 3.x 新增了划分为 32KB 共享内存与 32KB 一级缓存的功能)。
[2] 通常它位于工具的子目录中——例如,%CUDA_PATH%/tools(Windows)或$CUDA_PATH/tools中。
[3] Vasily Volkov在他的报告 “Better Performance at lower occupancy” 中着重强调了这点。详见http://bit.ly/YdScNG。
[4] http://bit.ly/WHTb5m。