《CUDA高性能并行计算》----第1章 起 步 1.1 运行CUDA样例程序

简介: 本章带领读者进入CUDA并行计算的世界。我们将从运行一个CUDA工具箱(CUDA Toolkit)提供的样例程序开始。这个样例程序包含串行和并行两个版本,因此读者可以通过运行性能上的对比来建立CUDA是如何增强运算能力的第一印象。

本 节 书 摘 来 自 华 章 出 版 社 《CUDA高性能并行计算》 一 书 中 的 第1章,第1.1节, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托尔蒂(Duane Storti)梅特·尤尔托卢(Mete Yurtoglu) 著, 苏统华 项文成 李松泽 姚宇鹏 孙博文 译 , 更 多 章 节 内 容 可 以 访 问 云 栖 社 区 “华 章 计 算 机” 公 众 号 查 看。

第1章

起 步

本章带领读者进入CUDA并行计算的世界。我们将从运行一个CUDA工具箱(CUDA Toolkit)提供的样例程序开始。这个样例程序包含串行和并行两个版本,因此读者可以通过运行性能上的对比来建立CUDA是如何增强运算能力的第一印象。需要注意的是,搭建和执行应用需要依赖读者使用的操作系统,我们会对在Windows、Linux和 OS X下运行样例程序提供详细的指导。在本章的结尾,我们将给出后文用以讲解CUDA并行化的两个简单C语言程序。

在本章中,如果出现了需要读者注意的事项或者相关知识,我们会用提示(checkpoint)来指引读者阅读附录的相关内容。当提示读者此处需要去查询附录内容时,请相信这样做会比勉强继续阅读而不去弄清相关的关键知识更加节省时间。

在这里我们要介绍第一个提示:读者需要在一个能够使用CUDA的系统上工作,其中包括一块支持CUDA的图形显卡并且安装了CUDA开发套件。如果有任何关于开发环境的问题请参见附录A和附录B来确认硬件状态和软件状态。

1.1 运行CUDA样例程序

让我们从运行第一个样例程序nbody开始,以此获得一个有意义的CUDA初体验。这个程序模拟了大量受到万有引力影响的粒子群的运动情况,并且进行了可视化。

1.1.1 在Windows下运行CUDA样例程序

如果你在一个支持CUDA的Windows系统下工作,你需要拥有一块支持CUDA的GPU和相关的驱动程序,CUDA工具箱以及添加NVIDIA抯 Nsight插件的Microsoft Visual Studio。本书中的代码和讨论都是基于CUDA7.5、Nsight Visual Studio Edition 4.7和Visual Studio Community 2013 with 64-bit compilation(注意将解决方案设置为x64而不是Win32)。

这里我们假设读者知道如何找到并且运行CUDA样例程序。这里是另一个提示:如果你不知道如何找到并且运行一个CUDA样例程序,请到附录B中找到相关的说明,然后再回来进行下一步学习。

在CUDA Samples文件夹中(参见图1.1)你可以找到很多子文件夹,保存着多种类型的CUDA样例程序。另外还有图中高亮显示的bin文件夹。


25ba539b38807f5b2245042533f682a4d24d1261

找到并进入bin/win64/Release文件夹,这里存放着所有的可执行程序,参见图1.2。提示:如果读者在Release文件夹中没有找到这些可执行程序,请到附录B中找到关于将CUDA样例代码编译成可执行程序的说明。


2ce4baf9143348b2257a0773783f33aefea67ae5

在Release文件夹下,找到nbody样例程序的可执行程序(见图1.2),双击打开这个有趣且有意义的样例程序。程序会打开两个窗口,一个是如图1.3所示的图形化窗口,另一个是控制台窗口(其中最后一行应显示了读者所使用的GPU型号及计算能力,如图1.4所示)。(读者也许需要移动一下图形化窗口来查看控制台窗口的内容。)nbody模拟了上千个受到万有引力作用的粒子的运动并且对运动进行了可视化处理。图形化窗口的标题栏中包含了一些相关信息,其中包括模拟的粒子数目,每秒进行的相互作用次数,每秒进行的总浮点运算次数(GFLOPS)及其精度。


0e4500ed21e49e6e2985ff4c5cac6a1342f4ee55

通过控制台命令行指令执行CUDA样例也是十分有用的,读者可以参考以下步骤。首先,让我们先给出另一个提示:如果在执行下面建议的命令中遇到了任何问题,请到附录B寻找相关解决办法。

启动Visual Studio 并且打开Visual Studio 命令行界面(可以在TOOLS菜单中找到)使用资源管理器,复制Release文件夹地址(其中包含了CUDA样例程序的可执行程序)。输入cd命令并粘贴文件夹路径可以将当前路径设置到Release文件夹,然后执行nbody命令来运行这个模拟程序。

1.1.2 在Linux下运行CUDA样例程序

这里让我们从一个提示入手:如果在执行下面建议的命令中遇到了任何问题,请到附录B寻找相关解决办法。

打开终端并使用cd命令进入到 NVIDIA_CUDA-7.5_Samples/5_Simulations/nbody目录下使用make命令编译nbody程序,然后输入 ./nbody 命令来运行这个模拟程序。通过类似的流程,读者可以运行任何感兴趣的CUDA样例程序。

1.1.3 估计“加速效果”

在GPU并行的术语中,我们将把一个计算任务以原来N倍的速度运行称为“NX加速”(这里X是“倍”的意思)。(这里的“加速”一词并不准确,使用它可能会让一些学习过动力学的读者感到不适,但是我们要适应并行计算的传统做法,毕竟术语是不太可能改变的。)

这是一个初步评估加速效果的好时机,因为nbody在这一点上很有代表性。nbody的命令行窗口提供了一系列的可选参数,这些参数可以在通过命令行执行nbody时设置。我们将用到这其中的三个参数,如果感兴趣,读者可以尝试使用更多的参数:
-benchmark命令可以让这个模拟过程进入适合评估性能的模式,尽可能减少可视化输出所耗费的时间。

-cpu命令可以在CPU下运行这个程序而不是在GPU下。

-fp64命令可以在这个模拟中进行64位双精度浮点运算而不是32位单精度运算。

nbody命令行窗口也显示了 “这些CUDA样例不是为了性能评估之用” 的声明,因此我们在nbody上进行一些基准测试只是为了获取一些粗糙的加速估计结果。但是需要对这些数字保持一些应有的怀疑,不要过分迷信。

首先运行nbody -benchmark(Linux/OS X下运行./nbody -benchmark)并记录下GPU下运行的输出结果,其中包含每秒进行浮点运算数的报告。下一步,运行带有 -benchmark -cpu参数的nbody程序并且记录下对应的CPU执行结果。然后加入-fp64 参数重复上面的测试。

在我们使用GeForce 840M的笔记本上,估算的GPU的每秒单精度浮点运算次数大约是CPU的120倍。在双精度下,GPU大约加速6倍左右。这里,请注意另一个提示:在继续阅读下文前,读者应该在自己的系统上实际运行一下上述测试来获取一个实在的加速体验。

需要注意,正如其声明中所言,CPU的实现可能没有被全面优化过,而GPU端的程序可能已经做了全面的优化。事实上,nbody下docs子文件夹包含了一个全面而有价值的GPU优化实现的论文。先不考虑那个声明,我们可以从这些初次的尝试中学到一些东西:1.基于GPU的并行可以在计算吞吐上带来明显收益。2.使用一个GeForce显卡在单精度运算上的提升高出双精度计算很多倍。

读者所获得的加速体验可以很好地反映CUDA开发的经验法则。当你第一次在GPU上并行化你的计算任务时,你可以获得初步的性能提升;通常通过选择正确的内存模式(我们将对可选的模式进行讨论)抑或购买一块更加高端的GPU(特别是当双精度计算对你十分重要并且你能负担得起一块Tesla显卡),你可以获得第二次性能上的提升;性能的第三次大幅提升往往需要进一步对硬件细节参数进行调优。我们的讨论会针对前两个加速情况,然后给出一些关于第三次性能提升的参考资料。

以上就是我们对nbody样例的观察,但是在继续之前,让我们运行一个更加简单的样例。在2_Graphics文件夹中运行volumeRender样例(如图1.1所示),通过移动鼠标实时改变视角与一个3D数据集进行交互。我们将在第7章中建立我们自己的3D可视化应用。

读者可以随时继续探索CUDA的样例程序,这里需要准备好阅读下一节。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
并行计算 C++ 异构计算
Nvidia 并行计算架构 CUDA 分析(一)——CUDA 简介
    CUDA(Compute Unified Device Architecture,统一计算设备架构)是由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。
4933 0
|
并行计算 计算机视觉 异构计算
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
190 0
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
|
并行计算 PyTorch 算法框架/工具
关于电脑有独立显卡但torch.cuda.is_available()运行出现为False的问题解决方案
关于电脑有独立显卡但torch.cuda.is_available()运行出现为False的问题解决方案
255 0
|
机器学习/深度学习 并行计算 数据可视化
PyTorch自定义CUDA算子教程与运行时间分析
PyTorch自定义CUDA算子教程与运行时间分析
300 0
|
机器学习/深度学习 并行计算 PyTorch
基于Pytorch使用GPU运行模型方法及可能出现的问题解决方法
基于Pytorch使用GPU运行模型方法及可能出现的问题解决方法
2206 0
基于Pytorch使用GPU运行模型方法及可能出现的问题解决方法
|
机器学习/深度学习 并行计算 数据可视化
PyTorch自定义CUDA算子教程与运行时间分析(二)
最近因为工作需要,学习了一波CUDA。这里简单记录一下PyTorch自定义CUDA算子的方法,写了一个非常简单的example,再介绍一下正确的PyTorch中CUDA运行时间分析方法。
660 0
PyTorch自定义CUDA算子教程与运行时间分析(二)
|
并行计算 数据可视化 PyTorch
PyTorch自定义CUDA算子教程与运行时间分析(一)
最近因为工作需要,学习了一波CUDA。这里简单记录一下PyTorch自定义CUDA算子的方法,写了一个非常简单的example,再介绍一下正确的PyTorch中CUDA运行时间分析方法。
1474 0
|
并行计算
CUDA 动态并行 【读书笔记】
CUDA 动态并行 【读书笔记】
106 0
CUDA 动态并行 【读书笔记】
|
异构计算 Windows 存储
带你读《基于CUDA的GPU并行程序开发指南》之二:开发第一个CPU并行程序
本书旨在帮助读者了解与基于CUDA的并行编程技术有关的基本概念,并掌握实用c语言进行GPU高性能编程的相关技巧。本书第一部分通过CPU多线程编程解释了并行计算,使得没有太多并行计算基础的读者也能毫无阻碍地进入CUDA天地;第二部分重点介绍了基于CUDA的GPU大规模并行程序的开发与实现,并通过大量的性能分析帮助读者理解如何开发一个好的GPU并行程序以及GPU架构对程序性能的影响;本书的第三部分介绍了一些常用的CUDA库。
|
内存技术 程序员 异构计算
带你读《基于CUDA的GPU并行程序开发指南》之三:改进第一个CPU并行程序
本书旨在帮助读者了解与基于CUDA的并行编程技术有关的基本概念,并掌握实用c语言进行GPU高性能编程的相关技巧。本书第一部分通过CPU多线程编程解释了并行计算,使得没有太多并行计算基础的读者也能毫无阻碍地进入CUDA天地;第二部分重点介绍了基于CUDA的GPU大规模并行程序的开发与实现,并通过大量的性能分析帮助读者理解如何开发一个好的GPU并行程序以及GPU架构对程序性能的影响;本书的第三部分介绍了一些常用的CUDA库。