带宽:
带宽 - 数据可以传输的速率 - 是性能最重要的门控因素之一。 代码的几乎所有变化都应该在它们如何影响带宽的情况下进行。 带宽可能会因数据存储的内存选择,数据布局方式以及访问顺序以及其他因素而受到显着影响。
要准确测量性能,计算理论和有效带宽非常有用。 当后者远低于前者时,设计或实现细节可能会降低带宽,并且应该成为后续优化工作的主要目标。
高优先级:在衡量性能和优化优势时,使用计算的有效带宽作为度量标准。
理论带宽计算:
理论带宽可以使用产品文献中提供的硬件规格进行计算。 例如,NVIDIA Tesla M2090使用GDDR5(双倍数据速率)RAM,存储器时钟频率为1.85 GHz,存储器接口为384位。
使用这些数据项,NVIDIA Tesla M2090的最高理论内存带宽为177.6 GB / s
$(1.85times10^{9}times(384/8)times2)div10^{9}=177.6GB/s
$
在此计算中,由于双倍数据速率,存储器时钟速率被转换为Hz,乘以接口宽度(除以8,将位转换为字节)并乘以2。 最后,此产品除以$10^{9}$以将结果转换为GB / s。
一些计算使用$1024^3$而不是$10^9$进行最终计算。 在这种情况下,带宽将达到165.4GB / s。 计算理论和有效带宽时使用相同的除数很重要,以便比较有效。
启用ECC后,由于内存校验和的额外流量,有效最大带宽减少了大约20%,但ECC对带宽的确切影响取决于内存访问模式。
有效带宽计算:
有效带宽是通过定时特定的程序活动以及了解程序如何访问数据来计算的。 为此,请使用以下等式:
$Effective bandwidth=((B_{r}+B_{w})\div10^{9})\div time$
这里,有效带宽以GB / s为单位,$B_{r}$是每个内核读取的字节数,$B_{w}$是每个内核写入的字节数,时间以秒为单位。
例如,要计算2048 x 2048矩阵副本的有效带宽,可以使用以下公式:
$Effective bandwidth=((2048^{2}\times4\times2)\div 10^{9})\div time$
元素数量乘以每个元素的大小(浮点数为4个字节)乘以2(因为读取和写入),再除以$10^{9}$(或$1,024^3$)以获得传输的内存GB。 这个数字除以获得GB / s的秒数。
吞吐量由Visual Profiler报告:
对于计算能力为2.0或更高的设备,Visual Profiler可用于收集多个不同的内存吞吐量度量。 以下吞吐量指标可显示在“详细信息”或“详细信息图”视图中:
- Requested Global Load Throughput
- Requested Global Store Throughput
- Global Load Throughput
- Global Store Throughput
- DRAM Read Throughput
- DRAM Write Throughput
请求的全局负载吞吐量和请求的全局存储吞吐量值指示内核请求的全局内存吞吐量,因此对应于有效带宽计算下显示的计算所获得的有效带宽。
由于最小内存事务大小大于大多数字大小,因此内核所需的实际内存吞吐量可能包括未被内核使用的数据传输。 对于全局内存访问,此实际吞吐量由全局负载吞吐量和全局存储吞吐量值报告。
请注意,这两个数字都很有用。 实际的内存吞吐量显示了代码与硬件限制有多接近,并且将有效或请求的带宽与实际带宽进行比较,可以很好地估计由于存储访问次优联合而浪费了多少带宽。 对于全局内存访问,请求内存带宽与实际内存带宽的比较由全局内存负载效率和全局内存存储效率度量标准报告。