天天看点

《CUDA C编程权威指南》——2.2节给核函数计时

本节书摘来自华章社区《cuda c编程权威指南》一书中的第2章,第2.2节给核函数计时,作者[美] 马克斯·格罗斯曼(max grossman) ,更多章节内容可以访问云栖社区“华章社区”公众号查看

2.2 给核函数计时

在内核的性能转换过程中,了解核函数的执行需要多长时间是很有帮助并且十分关键的。衡量核函数性能的方法有很多。最简单的方法是在主机端使用一个cpu或gpu计时器来计算内核的执行时间。在本节,你需要设置一个cpu计时器,并学习使用nvidia分析工具来计算执行时间。第6章将教你如何使用cuda特定的计时程序。

2.2.1 用cpu计时器计时

可以使用gettimeofday系统调用来创建一个cpu计时器,以获取系统的时钟时间,它将返回自1970年1月1日零点以来,到现在的秒数。程序中需要添加sys/time.h头文件,如代码清单2-5所示。

《CUDA C编程权威指南》——2.2节给核函数计时
《CUDA C编程权威指南》——2.2节给核函数计时
《CUDA C编程权威指南》——2.2节给核函数计时

了解自身局限性

在调整执行配置时需要了解的一个关键点是对网格和块维度的限制。线程层次结构中每个层级的最大尺寸取决于设备。

cuda提供了通过查询gpu来了解这些限制的能力。在本章的2.4节有详细的介绍。

对于fermi设备,每个块的最大线程数是1 024,且网格的x、y、z三个方向上的维度最大值是65 535。

2.2.2 用nvprof工具计时

自cuda 5.0以来,nvidia提供了一个名为nvprof的命令行分析工具,可以帮助从应用程序的cpu和gpu活动情况中获取时间线信息,其包括内核执行、内存传输以及cuda api的调用。其用法如下。

《CUDA C编程权威指南》——2.2节给核函数计时

以上结果的前半部分来自于程序的输出,后半部分来自于nvprof的输出。可以注意到,cpu计时器显示消耗的内核时间为3.26ms,而nvprof显示消耗的内核时间为2.90ms。在这个例子中,nvprof的结果更为精确,因为cpu计时器测量的时间中包含了来自nvprof附加的时间。

nvprof是一个能帮助你理解在执行应用程序时所花费的时间主要用在何处的强大工具。可以注意到,在这个例子中,主机和设备之间的数据传输需要的时间比内核执行的时间要多。图2-8所描绘的时间线(未按比例绘制),显示了在cpu上消耗的时间、数据传输所用的时间以及在gpu上计算所用的时间。

《CUDA C编程权威指南》——2.2节给核函数计时

对于hpc工作负载,理解程序中通信比的计算是非常重要的。如果你的应用程序用于计算的时间大于数据传输所用的时间,那么或许可以压缩这些操作,并完全隐藏与传输数据有关的延迟。如果你的应用程序用于计算的时间少于数据传输所用的时间,那么需要尽量减少主机和设备之间的传输。在第6章中,你将会学习如何使用cuda流和事件来压缩计算量和通信量。

比较应用程序的性能将理论界限最大化

在进行程序优化时,如何将应用程序和理论界限进行比较是很重要的。由nvprof得到的计数器可以帮助你获取应用程序的指令和内存吞吐量。如果将应用程序的测量值与理论峰值进行比较,可以判定你的应用程序的性能是受限于算法还是受限于内存带宽的。以tesla k10为例,可以得到理论上的比率:

tesla k10单精度峰值浮点运算次数

745 mhz核心频率 2 gpu/芯片(8个多处理器 192个浮点单元 32核心/多处理器)* 2 ops/周期=4.58 tflops(flops表示每秒浮点运算次数)

tesla k10内存带宽峰值

2 gpu/芯片 256位 2 500 mhz内存时钟* 2 ddr / 8位/字节=320 gb/s

指令比∶字节

4.58 tflops/ 320 gb/s,也就是13.6个指令:1个字节

对于tesla k10而言,如果你的应用程序每访问一个字节所产生的指令数多于13.6,那么你的应用程序受算法性能限制。大多数hpc工作负载受内存带宽的限制。

继续阅读