《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所示。

image
image

你可以用cpuSecond函数来测试你的核函数:

image

由于核函数调用与主机端程序是异步的,你需要用cudaDeviceSynchronize函数来等待所有的GPU线程运行结束。变量iElaps表示程序运行的时间,就像你用手表记录的核函数的执行时间(用秒计算)。

现在,通过设置数据集大小来对一个有16M个元素的大向量进行测试:

image

由于GPU的可扩展性,你需要借助块和线程的索引来计算一个按行优先的数组索引i,并对核函数进行修改,添加限定条件(i<N)来检验索引值是否越界,如下所示:

image

有了这些更改,可以使用不同的执行配置来衡量核函数。为了解决创建的线程总数大于向量元素总数的情况,你需要限制内核不能非法访问全局内存,如图2-7所示。

image

代码清单2-5展示了如何在主函数中用CPU计时器测试向量加法的核函数。

image
image
image
image

默认的执行配置被设置为一个包含16 384个块的一维网格,每个块包含1 024个线程。用以下命令编译并运行程序:

image

在基于英特尔Sandy Bridge架构的系统上进行测试,从代码清单2-5的示例中可以看出,在GPU上进行的向量加法的运算速度是在CPU上运行向量加法的3.86倍。

image

把块的维度减少到512可以创建32 768个块。在这个新的配置下,内核的性能提升了1.19倍。

image

如果进一步将块的维度降低到256,系统将提示以下错误信息,信息表示块的总数超过了一维网格的限制。

image

image

2.2.2 用nvprof工具计时

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

image

可以使用以下命令获取更多关于nvprof的帮助信息:

image

你可以用如下命令去测试内核:

image

nvprof的输出结果会因你使用的GPU类型不同而有所差异。以下结果是从Tesla GPU中得到的:

image

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

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


image

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

image

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
Ubuntu 安全 网络协议
Ubuntu设置smb功能
通过以上步骤,您已经在Ubuntu系统上成功设置了SMB共享服务,实现了与不同操作系统间的文件共享。记住,根据实际需求调整配置文件,特别是在安全性方面,比如限制访问权限、使用加密传输等,以确保共享环境既便利又安全。
1509 1
|
机器学习/深度学习 编解码 文件存储
深度学习中的模型压缩技术:从理论到实践
本文旨在探讨深度学习领域中的模型压缩技术,包括其背后的理论基础、常见方法以及在实际场景中的应用。我们将从基本的量化和剪枝技术开始,逐步深入到更高级的知识蒸馏和模型架构搜索。通过具体案例分析,本文将展示这些技术如何有效减少模型的大小与计算量,同时保持甚至提升模型的性能。最后,我们将讨论模型压缩技术未来的发展方向及其潜在影响。
|
机器学习/深度学习 并行计算 C++
VS2017中嵌入CUDA编程的一些坑
VS2017中嵌入CUDA编程的一些坑
VS2017中嵌入CUDA编程的一些坑
|
大数据 计算机视觉
Halcon 学习笔记三:形态学
Halcon 学习笔记三:形态学
946 0
|
Linux Windows
fatal error C1083 无法打开包括文件 “sys/time.h” No such file or directory
fatal error C1083 无法打开包括文件 “sys/time.h” No such file or directory
1607 0
|
监控 并行计算 图形学
阿里云容器服务GPU监控2.0进阶篇2:学会剖析(Profiling)您的GPU使用情况
本系列相关文章:阿里云容器服务GPU监控2.0基础篇1:基本功能使用阿里云容器服务GPU监控2.0基础篇2:监控NVLINK带宽阿里云容器服务GPU监控2.0基础篇3:监控NVIDIA XID错误阿里云容器服务GPU监控2.0进阶篇1:剖析(Profiling)GPU使用情况必备知识阿里云容器服务GPU监控2.0进阶篇2:学会剖析(Profiling)GPU使用情况为了能够更深入理解GPU Pro
5117 1
阿里云容器服务GPU监控2.0进阶篇2:学会剖析(Profiling)您的GPU使用情况
|
弹性计算 并行计算 NoSQL
Clion配置远程CUDA调试环境
在阿里云GPU ECS实例上搭建Remote CUDA开发环境,使用Jetbrains Clion作为Develop IDE。
1330 1
Clion配置远程CUDA调试环境
|
算法 C++
干货 | 11分钟带你全面掌握branch and bound(分支定界)算法-概念篇(下)
干货 | 11分钟带你全面掌握branch and bound(分支定界)算法-概念篇
1812 0
干货 | 11分钟带你全面掌握branch and bound(分支定界)算法-概念篇(下)
|
分布式计算 Hadoop Java
动手写的第一个MapReduce程序--wordcount
动手写的第一个MapReduce程序--wordcount
410 0
|
开发者
QFileDialog可同时选择文件/目录和文件夹
QFileDialog可同时选择文件/目录和文件夹
QFileDialog可同时选择文件/目录和文件夹