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

本文涉及的产品
数据传输服务 DTS,同步至DuckDB 3个月
简介:

本节书摘来自华章社区《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所示。


0eb0f59e902d41d380133fbfbe5eee5455c8daf7


7601694035989d6f70771e9e7fc30fba7a8aa155


7062bd3baf5d506e540ee195314df0b64ed2bc09

了解自身局限性
在调整执行配置时需要了解的一个关键点是对网格和块维度的限制。线程层次结构中每个层级的最大尺寸取决于设备。
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的调用。其用法如下。


177044e1af85000a4f06be538da00c46a99e6a63

以上结果的前半部分来自于程序的输出,后半部分来自于nvprof的输出。可以注意到,CPU计时器显示消耗的内核时间为3.26ms,而nvprof显示消耗的内核时间为2.90ms。在这个例子中,nvprof的结果更为精确,因为CPU计时器测量的时间中包含了来自nvprof附加的时间。
nvprof是一个能帮助你理解在执行应用程序时所花费的时间主要用在何处的强大工具。可以注意到,在这个例子中,主机和设备之间的数据传输需要的时间比内核执行的时间要多。图2-8所描绘的时间线(未按比例绘制),显示了在CPU上消耗的时间、数据传输所用的时间以及在GPU上计算所用的时间。


545590b89f80785b021ad848418a170e1dc54589

对于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工作负载受内存带宽的限制。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
机器学习/深度学习 存储 并行计算
一篇就够:高性能推理引擎理论与实践 (TensorRT)
本文分享了关于 NVIDIA 推出的高性能的深度学习推理引擎 TensorRT 的背后理论知识和实践操作指南。
15905 9
一篇就够:高性能推理引擎理论与实践 (TensorRT)
|
Web App开发 数据可视化 JavaScript
动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper
动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper
1391 0
|
存储 NoSQL Java
|
机器学习/深度学习 虚拟化 异构计算
浅析GPU通信技术(上)-GPUDirect P2P
1. 背景 GPU在高性能计算和深度学习加速中扮演着非常重要的角色, GPU的强大的并行计算能力,大大提升了运算性能。随着运算数据量的不断攀升,GPU间需要大量的交换数据,GPU通信性能成为了非常重要的指标。
31439 1
|
Java Apache 索引
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
981 1
|
存储 安全 文件存储
NUC11+ESXi7下安装Dark群晖最新版本DSM 7.1.1-42962
NUC11+ESXi7下安装Dark群晖最新版本DSM 7.1.1-42962
2992 0
NUC11+ESXi7下安装Dark群晖最新版本DSM 7.1.1-42962
|
计算机视觉
OpenCV_10 傅里叶变换:频域滤波+CV的应用
傅里叶变换是由法国的一位数学家Joseph Fourier在18世纪提出来的,他认为:任何连续周期的信号都可以由一组适当的正弦曲线组合而成。
595 0
OpenCV_10 傅里叶变换:频域滤波+CV的应用
|
计算机视觉
OpenCV-绘制旋转矩形
OpenCV-绘制旋转矩形
482 0
|
机器学习/深度学习 网络协议 Docker
基于docker搭建conda深度学习环境(支持GPU加速)
在Ubuntu系统,创建一个docker,然后搭建conda深度学习环境,这样可以用conda或pip安装相关的依赖库了。
4482 0
|
并行计算 API 异构计算
GPU架构及异构计算介绍GPU架构以及异构计算的基本原理
GPU架构及异构计算介绍GPU架构以及异构计算的基本原理
1960 0
GPU架构及异构计算介绍GPU架构以及异构计算的基本原理