《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的样例程序,这里需要准备好阅读下一节。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
4月前
|
存储 编解码 运维
2026年阿里云轻量应用服务器配置价格表与性能测评
阿里云轻量应用服务器是面向入门级用户、个人开发者及小微企业的一站式云服务产品,主打**开箱即用、极简运维、高性价比**,整合计算、存储、网络资源于一体,无需复杂配置即可快速部署应用。2026年产品全面升级,所有规格默认配备**200M峰值带宽+不限流量**,彻底告别流量焦虑,同时提供丰富的应用镜像与简化控制台,大幅降低云计算使用门槛。
1298 0
|
存储 JavaScript 前端开发
JS 数组操作的利器:splice() 和 slice() 方法详解
JS 数组操作的利器:splice() 和 slice() 方法详解
1321 0
|
设计模式 前端开发 数据库
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
673 0
|
存储 人工智能 云栖大会
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
2005 6
|
人工智能 算法 NoSQL
GraphRAG 与 RAG 的比较分析
Graph RAG 技术通过引入图结构化的知识表示和处理方法,显著增强了传统 RAG 系统的能力。它不仅提高了信息检索的准确性和完整性,还为复杂查询和多步推理提供了更强大的支持。
2609 10
|
SQL 存储 监控
SQLServer事务复制延迟优化之并行(多线程)复制
【9月更文挑战第12天】在SQL Server中,事务复制延迟会影响数据同步性。并行复制可通过多线程处理优化这一问题,提高复制效率。主要优化方法包括:配置分发代理参数、优化网络带宽、调整系统资源、优化数据库设计及定期监控维护。合理实施这些措施可提升数据同步的及时性和可靠性。
716 1
|
存储 数据安全/隐私保护 Python
`zxcvbn`是一个用于密码强度估计的开源库,由Dropbox开发。它基于一系列启发式方法,包括密码字典、常见密码模式、键盘布局等,来评估密码的强度。
`zxcvbn`是一个用于密码强度估计的开源库,由Dropbox开发。它基于一系列启发式方法,包括密码字典、常见密码模式、键盘布局等,来评估密码的强度。
|
关系型数据库 MySQL 数据库
SQLite和MySQL指南
【5月更文挑战第18天】了解如何使用Python连接SQLite和MySQL数据库。首先,安装必要的库,如`sqlite3`(Python自带)和`mysql-connector-python`。接着,连接SQLite数据库,创建表、插入和查询数据。对于MySQL,同样建立连接,但需提供额外的连接信息。使用参数化查询防止SQL注入,并处理异常以增强程序稳定性。可选ORM框架如SQLAlchemy简化操作。考虑使用内存数据库、连接池、异步库(如`aiosqlite`)以优化性能。使用环境变量或配置文件安全管理连接信息,并实施安全性措施保护数据库。通过本文,提升Python数据库编程技能。
|
机器学习/深度学习 自然语言处理
[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences
[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences
655 1