首页>参考读物>计算机科学与技术>软件与程序设计

OpenACC并行程序设计:性能优化实践指南
作者 : [美]罗布?法伯(Rob Farber) 编著
译者 : 吴长江 阚光远 译
出版日期 : 2017-08-10
ISBN : 978-7-111-57675-4
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 261
开本 : 16
原书名 : Parallel Programming with OpenACC
原出版社: Elsevier (Singapore) Pte Ltd
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书集结23位世界各地的业内专家,通过清晰易懂的实战案例讲解OpenACC并行编程标准,使得程序员可以轻松将其运用于CPU编程、GPU编程等,从而提高当今大型超级计算机的程序性能。

图书特色

内容简介

作为久负盛名的“红宝书”的最新一版,本书将着色器相关的技术完全融入了经典的以函数讲解为核心的章节当中,并且通过丰富的代码案例来演示这些现代化的技法。从基础的概念,到物体的绘制、着色、像素、片元、变换方法、纹理、帧缓存、光照和阴影、内存等高级方法和非图形学应用的讲解,无所不包。本书还讲解了着色器的每一个阶段,包括全新的细分、几何和计算着色器。
本书共12章,第1章概述OpenGL主要特性和功能;第2章讨论OpenGL中最主要的特性——可编程着色器和SPIR-V;第3章介绍使用OpenGL进行几何体绘制的各种方法,以及一些可以让渲染更为高效的优化手段;第4章阐释OpenGL对于颜色的处理过程;第5章介绍在一个二维计算机屏幕上表现三维场景的操作细节;第6章讨论将几何模型与图像结合来创建真实的、高质量的三维模型的方法;第7章介绍计算机图形的光照效果模拟方法;第8章介绍使用可编程着色器生成纹理和其他表面效果的方法细节;第9章解释OpenGL管理和细分几何表面的着色器功能;第10章介绍在OpenGL渲染流水线中使用着色器进行几何体图元修改的特别技术;第11章介绍使用OpenGL帧缓存和缓存内存实现高级渲染技术和非图形学应用的相关方法;第12章介绍了最新的着色器阶段,将通用计算的方法融合到OpenGL的渲染流水线当中。


作为如今世界知名的图形学标准接口,OpenGL的最新版本(OpenGL 4.5)显著提升了应用程序的运行效率、灵活性和性能。OpenGL 4.5是一个非常成熟而且稳健的平台,可以实现高质量的计算机图像和交互程序的开发工作,并且使用2D和3D物体、彩色图像以及着色器的方式来表达整个场景。
本书详细介绍了OpenGL 4.5(包括4.4、SPIR-V和扩展功能),以及OpenGL着色语言的方方面面,能有效地帮助你编写和维护OpenGL代码。

本版新增OpenGL特性包括
涵盖OpenGL 4.5的直接状态访问(DSA)特性,这是对OpenGL开发模式及应用程序访问对象的方式的一次重大变革。
有关着色器的功能和GPU处理过程的深入讨论以及案例讲解,而越来越多的程序功能正趋向于在图形处理器上直接实现。
根据开发者社区的反馈和建议,增加了一些关键性功能的介绍和案例。
更新了附录部分,包含最新的OpenGL库、相关API、函数、变量、格式,以及调试和性能评价的方法。

作者简介

约翰·克赛尼希(John Kessenich)
来自Google的资深软件工程师、SPIR-V的创立者,自1999年以来就广泛参与到OpenGL和GLSL的Khronos标准开发当中。他是SPIR-V和GLSL标准说明书的主要编写者,并且开发了相关的着色器编译工具和解析器来考察相关标准的可移植性。
格雷厄姆·塞勒斯(Graham Sellers) 
来自AMD的软件架构和工程部门,是Khronos API的领导者之一,负责OpenGL ARB中的AMD功能部分。他对OpenGL和Vulkan的核心标准和扩展都做出了贡献,并且持有图形学和图像处理方面的一些专利。
戴夫·施莱尔(Dave Shreiner)
一位有着25年经验的计算机图形工作者,编写和教授计算机图形API相关的课程,并且一直是数本Addison-Wesley出版的计算机图形学图书的核心作者,从事相关写作已有近10年之久。

图书前言

欢迎阅读本书,这是一本由浅入深的书籍,从初学者到高级开发人员,都可以通过本书了解OpenACC的相关知识。本书由世界各地的24位作者共同编著而成,他们在高度并行编程的教学和实践方面分享了自己的专业知识。书中的例子既有时效性又不会过时。每个章节都是自包含的,可用于自学,也可以作为课堂教学的一部分。在github上可以找到幻灯片和示例代码:https://github.com/rmfarber/ParallelProgrammingWithOpenACC。
这是一本关于并行编程的书,不仅仅介绍OpenACC语法或从文档中收集的信息,更介绍了如何编写实际的、高性能的以及可移植的程序,这些程序可以运行在从CPU到GPU的大量设备上。具体而言,书中演示了使用PGI、Cray和PathScale等供应商提供的编译器编译示例代码,并在Intel x86处理器、Cavium 96核64位ARMv8处理器芯片集和NVIDIA GPU上运行。
性能和分析相辅相成,这也是为什么我们将开源代码和PGI分析器都包含在内。
自从2012年6月11日我第一次在Dr. Dobbs网站上看到“Easy GPU Parallelism with OpenACC”以来,OpenACC标准逐步升级,编译器技术逐渐成熟,发展速度令人惊讶。过去几年的突飞猛进意味着我们现在可以在大多数HPC站点上使用OpenACC,甚至免费提供的GNU编译器工具集也支持OpenACC。我们选择在中级和高级编程章节中提供实际应用示例,以方便读者实践,这是因为程序员需要解决实际问题,而不是解决课堂问题。同时,OpenACC还是一个很新的并行编程标准,书中的几个介绍性章节非常值得一读!

Rob Farber

上架指导

计算机\并行计算

封底文字

性能至上!OpenACC是为未来的高度并行而设计的,在现有代码中增加指令比用一门新语言重写代码简单得多。本书将帮助你精巧地设计各类应用,充分释放程序性能,不仅从当下的并行系统中受益,而且在之后的几十年中都将持续受益。
——Michael Wolfe,OpenACC技术委员会主席

过去十年,伴随着异构系统的突飞猛进,众多科研团队都开始在大型超级计算机上编写程序,而OpenACC正是实现加速的首选开放编程标准。本书包含丰富的OpenACC开发策略和实践经验,对于广大程序员而言极富参考价值。
——Jeffrey S. Vetter,橡树岭国家实验室

本书特色
·透彻讲解OpenACC的工作原理,逐步进阶编写可解决实际问题的高性能且可移植的程序。
·轻松掌握利用GPU实现程序加速的方法,包含分子动力学和天气建模等不同领域的实例。
·免费下载源代码和PPT:github.com/rmfarber/ParallelProgrammingWithOpenACC。

图书序言

性能至上。
如果用简短的话来总结这本书,那就是:OpenACC并行编程。无论你相信与否,我认为对于很多的读者来说,本书已经涵盖了你想要学习以及你必须掌握的所有内容。从数字计算开始到千禧年之交,归功于半导体技术的进步,我们几乎每年都在期待且接受越来越快的计算机系统。然而在过去的12年里,处理器时钟频率并未改进。这意味着在某些形式下,并行性是实现更高性能的唯一途径。
并行计算不是一个新话题。50多年来,计算机设计中的并行性已经以不同的形式得以应用。20世纪60年代,出现了带有多个独立功能单元的流水线处理器,包括Control Data 6600和7600,以及IBM 360型号91。向量处理器在20世纪70年代出现,包括Control Data STAR、德州仪器 ASC和Cray 1。在那个时代,人们设计和建立了多核处理器系统。20世纪80年代,对称共享内存的处理器越来越常见,特别是有了单芯片32位微处理器。同样在80年代,高度并行多节点计算机系统也面世了,例如nCUBE超立方、Intel iPSC/1等。现在,我们在常用的消息传递接口中标准化各种各样的消息传递编程模型。对于程序员而言,现在超级计算机的性能类似于早期的超级立方体系统,尽管当时最大的系统有超过90 000个节点。
今天,我们处于高性能计算机系统设计的另一个转折点。
并行性仍然是性能的驱动,这些系统有很多消息传递节点,但是节点本身现在变得高度并行。甚至工作站都比过去更并行了。这在某种程度上是因为处理器微架构采纳早期超级计算机的流水线和多功能单元特性。这些处理器包含SIMD指令,与早期的向量处理器有类似的功能,并且这些处理器包含多个核,在对称共享内存操作系统中每个核都表现得像一个独立处理器。许多工作站和超级计算机节点有很多芯片,通过高速处理器间的互联管理缓存一致性。每个节点或高端工作站中的核数量正在显著增加,从单核增加到如今超过20个核,在不久的将来还会有更多。本书出版时Intel集成众核(MIC)CPU在单个芯片上将有72个核。许多CPU核也支持多个硬件线程,通过利用应用程序级并行性来提供更高的总体性能。
现在,加速器设备已经很常见了,特别是将GPU用于计算。加速器设备出现在20世纪70年代,如浮点系统AP 120B和IBM 3838。随着半导体工艺越来越复杂,越来越昂贵,为高性能计算设计和实现定制加速器设备在经济上越来越不可行了。然而,GPU有自己的优点—它的“日常工作”就是图形处理,这弥补了很多设计和验证的开销。作为计算设备的GPU与大容量的CPU具有相同的经济优势。
GPU针对图形流水线中高度并行化的、规则的计算进行了优化,这恰好可以映射到许多科学和工程应用上。GPU具有与当前CPU中出现的相同种类的并行性,包含流水线、众核、SIMD式执行和多线程,但是GPU拥有的核数和带宽要远超CPU。在Intel最新的MIC处理器上,GPU也放弃了大缓存,而是选择了更多的核数和更高带宽的存储器接口。
这看起来像是把大量复杂的新东西强卖给“贫困”的应用程序开发人员。实际上,现在我们看到的所有先进计算机系统以及未来能够预见的计算机系统,都使用了与过去50年中常见的相同种类的并行性,只是在更小的设备上有更多的并行性。应用程序的生命周期一般都比单个计算机系统的要长,因此可以也应该在目前没有设计出来的未来系统上高性能执行。本书将帮助你使用正确的算法和数据结构,精巧地设计各类应用,从而使你能从当下的高度并行系统中受益,而且在未来的几十年中都将受益。
读者面临的挑战是,必须保证在为未来的10年或20年设计或者重构应用程序时,有足够多的并行度来满足所有不同的并行计算。这需要有足够的多核并行度来保持几十甚至几百个计算核的运行,甚至2~10倍的多核并行度来满足多线程槽。此外,还要有足够多的SIMD并行度来使用SIMD指令和高带宽存储器。你必须设计可扩展的算法和数据结构来利用所有计算的并行度和高带宽存储路径。既然不能改善那些无法测量的代码,那么我们就使用分析和追踪工具去识别程序的热点。如果可能,在两个或多个不同目标系统上执行你的应用程序来确保可移植性和稳定性。
在开发应用的过程中,你必须选择一门合适的语言。有很多好的选择,但本书聚焦于OpenACC指令。作为一门语言,OpenACC有三个优点。第一,并行程序设计并不简单,在现有代码中增加指令比用一门新语言重写更简单。第二,OpenACC是为未来的高度并行而设计的。它有意减少对现有程序的改动,让你专注设计扩展性更好的算法。第三,OpenACC具有跨不同加速器系统的可移植性,就像只有CPU的系统一样。只要写好一个OpenACC程序,它便可以在截然不同的目标系统上完美执行。如果供应商构建了一个新模型或者你的用户迁移到一个新的超级计算机上,你一定不想每次都重构代码或者重新调整应用。
请牢记,终极目标是性能!程序中的很多方面可以帮你得到更高的性能。好好设计你的程序,努力释放所有的潜能。

Michael Wolfe
OpenACC 技术委员会主席,PGI编译工程师

作者简介

[美]罗布?法伯(Rob Farber) 编著:暂无相关简介

译者简介

吴长江 阚光远 译:暂无简介

译者序

我们生活在一个信息爆炸的社会,太多的数据需要分析和计算。这些大规模数据计算的诉求,又推动着硬件不断发展。当前市面上,有多核CPU、众核处理器、GPU等加速设备可供选择。但软件的发展往往跟不上硬件的脚步。面对性能强悍的加速器,如何高效地利用它们来提升应用程序的性能,是摆在每个程序员面前的一大难题。
2011年11月,在美国盐湖城的超算大会上,NVIDIA、Cray、The Portland Group(PGI)和CAPS共同宣布了一种新的并行编程标准—OpenACC。在现有的程序中,可通过添加OpenACC指令来指导编译器将程序翻译为运行在加速器上的并行程序,而且大多数程序都无需重构现有代码。我个人对GPU编程比较熟悉,也曾移植了很多算法在GPU上实现,深知采用CUDA或者OpenCL这样的底层并行编程语言移植现有代码的痛苦。所以在2012年年初第一次接触到OpenACC后,我一直都在关注这个新的并行编程标准的进展,现在最新标准已经更新到了OpenACC 2.5。相比OpenACC 1.0,它添加了很多新的指令/导语,可以满足我们的实际应用需求。
本书是基于OpenACC 2.5标准撰写而成的,并且全书内容来自于不同产业界的资深科研人员,他们运用丰富的OpenACC开发经验,结合实际应用来具体讲述OpenACC并行编程—从基本入门、性能优化到如何从零开始用OpenACC移植一个实际应用。这些鲜活的示例,给想了解OpenACC以及想深入学习OpenACC的程序员带来了福音。
对于OpenACC并行编程,有几点个人看法。(1)OpenACC标准制定的速度远超编译器支持的速度。支持OpenACC的编译器目前屈指可数,早期只有PGI、Cray和CAPS,现在GNU的编译器开始支持OpenACC的某些指令,也有一些其他开源的OpenACC编译器,例如OpenUH。对于支持OpenACC的编译器,我只能说再多给点时间,毕竟软件实现的速度远跟不上标准制定的速度。(2)要在实际应用中用好OpenACC并行编程,需要程序员充分了解执行OpenACC程序的硬件平台,但现在很多OpenACC的开发人员似乎并不太了解自己所使用的加速器架构以及性能优化方法。如果脱离硬件平台来讨论书中的优化技巧,我认为是不现实的。
本书由我和阚光远共同翻译完成。其中阚光远翻译了第2、4、6章,我翻译了其他各章并统稿。感谢陈俊博、孙鹏博士百忙之中抽空整理第11、12章的内容。本书结合了很多行业应用,受限于我们的专业水平和翻译水准,译文难免有不当之处,敬请批评指正。我的联系方式为wcj0626@yeah.net。最后,特别感谢家人的支持,对每天晚上下班后伏在电脑前翻译此书的我一直给予关心和理解。

吴长江
2017年7月于杭州

图书目录

译者序
序言
前言
致谢
作者简介
第1章 从串行编程到并行编程1
1.1 简单的数据并行循环1
1.1.1 OpenACC内核构件与并行构件对比4
1.1.2 OpenACC并行的多种形式6
1.1.3 accFill_ex2运行时结果7
1.2 简单的任务并行示例8
1.3 Amdahl定律及其扩展9
1.3.1 大O表示法和数据传输11
1.3.2 accTask.cpp代码的扩展性12
1.4 并行执行和竞争条件14
1.5 无锁编程17
1.6 控制并行资源20
1.7 让生活更简单22
1.8 参考文献23
第2章 性能导向开发24
2.1 测试代码:共轭梯度法25
2.1.1 代码编译25
2.1.2 初始测试26
2.2 描述并行度28
2.2.1 加速waxpby28
2.2.2 加速dot31
2.2.3 加速matvec32
2.3 描述数据移动34
2.4 优化循环39
2.4.1 缩短向量长度40
2.4.2 增加并行度41
2.5 在多核系统中并行运行43
2.6 小结44
第3章 使用Score-P和Vampir分析混合应用性能46
3.1 性能分析技术和术语47
3.2 逐步性能提升48
3.3 激光驱动电子束的粒子单元模拟48
3.4 通过代码插装准备性能测量49
3.5 在应用程序执行期间记录性能信息50
3.6 第一个并行PIConGPU实现51
3.7 释放主机进程53
3.8 优化GPU内核53
3.9 增加GPU任务并行54
3.10 使用Score-P和Vampir记录OpenACC运行时事件55
3.11 小结56
3.12 参考文献56
第4章 数据传输流水线化58
4.1 初识流水线59
4.2 示例代码:曼德勃罗发生器59
4.2.1 分块计算62
4.2.2 分块数据拷贝63
4.2.3 异步执行63
4.3 在多种设备上实现流水线65
4.4 结论69
第5章 高级数据管理70
5.1 非结构化数据区域71
5.2 动态数据成员的聚合类型73
5.3 C++类数据管理75
5.3.1 创建通用列表容器类77
5.3.2 accList更新方法79
5.4 在例程中使用全局和模块变量80
5.5 仅在设备端可用的数据82
5.5.1 映射设备端数据83
5.5.2 MPI进程间共享设备端数据84
5.6 示例代码86
5.7 运行时结果91
5.8 小结93
第6章 循环执行调优94
6.1 loop构件95
6.2 基本loop优化子句97
6.2.1 auto子句97
6.2.2 independent子句98
6.2.3 seq子句98
6.2.4 reduction子句99
6.2.5 collapse子句101
6.3 高级loop优化子句102
6.3.1 gang、worker和vector子句102
6.3.2 tile子句102
6.4 性能测试结果104
6.5 小结105
第7章 多设备编程106
7.1 简介106
7.2 三种多设备编程方法107
7.2.1 处理设备相关性和选择设备107
7.2.2 单线程多设备编程108
7.2.3 多线程多设备编程108
7.2.4 多进程多设备编程109
7.3 示例:2D泊松方程的雅可比求解器109
7.4 域分解111
7.4.1 单线程多设备编程111
7.4.2 多线程多设备编程114
7.4.3 多进程多设备编程116
7.4.4 通信与计算重叠120
7.5 调试和分析122
7.5.1 使用cuda-memcheck和cuda-gdb调试122
7.5.2 使用nvprof和NVIDIA Visual Profiler分析123
7.6 小结123
7.7 参考文献124
第8章 Stencil和Feldkamp算法移植125
8.1 简介125
8.2 实验环境126
8.2.1 Feldkamp-Davis-Kress算法126
8.2.2 2D热方程133
8.3 OpenMP/OpenACC混合编程138
8.4 小结141
8.5 参考文献142
第9章 加速3D波方程143
9.1 简介143
9.2 示例代码:计算3D标量波方程144
9.3 栈变成堆146
9.4 测量主机基准扩展性148
9.4.1 创建OpenMP编译环境148
9.4.2 编译OpenMP代码149
9.4.3 运行OpenMP代码150
9.5 使用OpenACC工具150
9.5.1 添加OpenACC并行指令150
9.5.2 编译OpenACC并行指令151
9.5.3 理解统一内存151
9.5.4 使用统一内存152
9.5.5 运行统一内存152
9.5.6 使用可视化分析器分析统一内存153
9.6 使用OpenACC数据指令155
9.6.1 编译OpenACC数据指令156
9.6.2 分析OpenACC 数据指令156
9.6.3 运行OpenACC数据指令158
9.7 OpenACC多核系统158
9.7.1 编译OpenACC多核159
9.7.2 在多核系统上运行OpenACC160
9.8 小结160
9.9 参考文献161
第10章 应用程序开发详解162
10.1 CloverLeaf简介162
10.1.1 流体力学方案162
10.1.2 测试用例163
10.2 开发平台:Cray XK6163
10.3 开发OpenACC版本CloverLeaf164
10.3.1 热点164
10.3.2 独立内核加速165
10.3.3 多个内核加速166
10.3.4 GPU上实现完全驻留167
10.3.5 增加问题规模167
10.3.6 与混合MPI/OpenMP比较169
10.3.7 混合MPI/OpenACC169
10.3.8 版本A:初始性能169
10.3.9 版本B:内循环依赖170
10.3.10 版本C:嵌套循环和全局变量173
10.3.11 版本D:多GPU,减少隐式传输174
10.3.12 版本E:OpenACC同步等待175
10.3.13 GPU优化对CPU的影响178
10.3.14 多GPU扩展179
10.4 结论180
10.4.1 CPU上的OpenACC实现180
10.4.2 异构计算182
10.5 小结183
10.6 扩展信息184
第11章 GPU加速分子动力学聚类分析185
11.1 简介185
11.2 MD聚类分析概述186
11.2.1 聚类算法187
11.2.2 QCP快速计算成对RMSD188
11.2.3 原子选择和轨迹数据结构189
11.2.4 不相似矩阵计算190
11.3 硬件架构注意事项191
11.4 实现192
11.4.1 性能评估测试用例192
11.4.2 存储器布局优化192
11.4.3 QCP内积循环192
11.4.4 手写向量化QCP内积循环194
11.4.5 代码适配和使用OpenACC指令196
11.5 性能测试结果200
11.6 小结202
11.7 致谢203
11.8 参考文献203
第12章 增量式加速RI-MP2电子结构理论的相关方法206
12.1 简介206
12.2 原理208
12.3 实现209
12.3.1 GPU-1209
12.3.2 GPU-2210
12.3.3 GPU-3211
12.3.4 GPU-4212
12.3.5 GPU-5213
12.3.6 GPU-6214
12.3.7 GPU-7215
12.3.8 GPU-8216
12.4 结果217
12.4.1 计算细节217
12.4.2 问题规模扩展218
12.4.3 设备数量扩展219
12.4.4 总性能220
12.5 小结222
12.6 致谢223
12.7 参考文献223
第13章 将大型传统气候和天气建模代码移植到GPU上226
13.1 简介226
13.2 移植方法:步骤详解228
13.2.1 简化大气模型228
13.2.2 步骤1:添加并行区域229
13.2.3 步骤2:管理数据传输231
13.2.4 步骤3:基本优化233
13.2.5 并行循环包含子例程调用235
13.2.6 CUDA接口237
13.3 性能优化239
13.4 辐射参数化的结果241
13.5 参考文献243

教学资源推荐
作者: 杨树林 胡洁萍 编著
作者: (美)Harold Abelson,Gerald Jay Sussman,Julie Sussman
作者: 谢满德 刘文强 张国萍 编著
参考读物推荐
作者: 王小科 寇长梅 等编著
作者: [瑞士]路易斯·汤斯顿(Lewis Tunstall),[瑞士]莱安德罗·冯·韦拉(Leandro von Werra),[法]托马斯·沃尔夫(Thomas Wolf) 著
作者: 尹宝林 著