首页>参考读物>计算机科学与技术>计算机科学理论与基础知识

多核与GPU编程:工具、方法及实践
作者 : [阿联酋] 杰拉西莫斯?巴拉斯(Gerassimos Barlas) 著
译者 : 张云泉 贾海鹏 李士刚 袁良 等译
出版日期 : 2017-02-23
ISBN : 978-7-111-55768-5
定价 : 129.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 549
开本 : 16
原书名 : Multicore and GPU Programming:An Integrated Approach
原出版社: Elsevier (Singapore) Pte Ltd
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书覆盖广泛的关键并行计算技术:多核CPU编程和众核“大规模并行”技术。通过使用线程、OpenMP、MPI和CUDA,本书讲述能够利用当今的计算平台来结合CPU和GUP硬件的软件的设计与开发,解释如何从顺序编程范式转换到并行计算范式。

图书特色

汇集多核/众核时代的主流开发工具,学会选择并综合运用不同的平台和方法
面向真实需求设计和优化代码,在实践中掌握并行计算的编程之道

本书涵盖了当前主要的并行计算关键技术,包括多核CPU编程、大规模并行的众核GPU计算。本书详细讨论了如何使用线程、OpenMP、MPI、CUDA和Thrust设计与开发软件,以充分利用当今异构计算平台上的丰富计算资源。本书凝结了作者十多年来的并行计算教学经验,不仅充分说明了从串行编程到并行计算的转变方式,还提供了大量示例和案例研究。通过本书,读者可以学习如何使用MPI开发运行在分布式内存系统上的应用程序,如何使用库或者指令创建多核应用,如何编写在可用计算资源间实现负载均衡的优化程序,以及如何针对目标多核平台进行程序剖析和调试。

本书主要特色
涵盖所有主流多核编程工具,包括线程、OpenMP、MPI和CUDA。
涵盖多种针对并行软件开发效率的工具和库,包括Qt线程、Thrust和Boost.MPI。
涵盖重要并行编程设计模式的实现。
讨论如何融合不同的工具和范式提升程序性能。
结合案例研究详细讨论本书涵盖的内容,并提供完整的源代码。
使用启发式和分析的方法检查负载均衡,并详细说明可分负载理论。


内容简介
本书从并行软件的实现、调试、优化和剖析四个方面,详细讨论了当前主要的并行计算关键技术,主要内容包括:多核和并行程序设计、共享内存编程中的线程与OpenMP、分布式内存编程、GPU编程、Thrust模板库、负载均衡等。本书结合具体的代码和案例分析,揭示了如何使用库或者指令创建多核应用,如何使用MPI开发分布式应用程序,如何使用CUDA开发高性能GPU程序,如何实现负载均衡,以及如何针对目标多核平台进行程序剖析和调试等。本书可供从事高性能计算技术研究的专业人员参考,也可作为高校相关专业的教学用书。

作者简介
杰拉西莫斯·巴拉斯(Gerassimos Barlas) 沙迦美国大学计算机科学与工程系教授。他的研究兴趣包括并行算法的开发与分析,以及负载均衡的建模框架和分布式视频点播。巴拉斯教授讲授并行编程课程已超过十年时间,早在20世纪90年代,他就开始研究并行计算,并积极参与并行和分布式系统可分负载理论这一新领域的研究工作。

译者简介
张云泉 中科院计算所研究员,主要研究方向为大数据并行处理、并行程序设计和性能评价、并行计算和并行编程模型等。曾任中国计算机学会YOCSEF学术委员会主席(2010~2011年)、中国软件行业协会常务理事/数学软件分会秘书长、中国计算机学会常务理事/高性能计算专业委员会秘书长、大数据专家委员会副秘书长。

图书前言

多核架构出现在21世纪的第一个10年里,给并行计算带来了勃勃生机。新平台需要新方法来进行软件开发,其中一个新方法就是把工具和工作站网络时代的惯例同新兴软件平台(如CUDA)相结合。
为满足这种需求,本书将介绍目前主流的工具和技术,不仅是各自独立的工具和技术,更重要的是将它们相互结合。书中会提供多平台和程序设计范例(如消息传递和线程)高效结合的实例。顾名思义,“Hybrid”(混合)计算,是高性能计算的一个新趋势,针对百亿亿级的性能需求,使软件有可能扩展到数百万的线程上。
所有章节都包含丰富的示例和实际问题,并比较了不同的设计脚本,重点在于如何使其实际运作起来。那些能使得高效的软件开发区别于徒劳无功的软件开发训练的所有细节,都以有序的形式呈现出来。
本书介绍了从20世纪90年代继承而来的最新的先进工具(例如OpenMP和MPI标准),并包括更前沿的平台,如具有复杂线程管理功能的Qt库,以及具有在不同多核架构(包括CPU和GPU)上配置相同软件功能的Thrust模板库。
我不可能面面俱到地给出多核开发中的所有可用工具。即使是POSIX线程之类的一些行业标准,书中也并未涉及。
本书不仅旨在介绍主流范型(范围从OpenMP的串行代码半自动并行化到用来巩固MPI的显式通信“plumping”)的实例,还要讲解高效的多核软件开发背后的原理,并指导读者进行实践。
本书内容
本书可以分成如下几个逻辑单元,虽然书中没有明确地这样区分。
多核软件的设计概述概述:第1章介绍多核硬件,讨论了一些具有影响力的体系结构范型示例。第1章也介绍了加速比和效率,在评估多核和并行软件时这些是基本的度量方式。1.5节告诉读者如何从多核和众核硬件激动人心的新进展中预测出什么是人们所期待的方法。
第2章讨论可应用于并行和多核软件开发的方法论与设计模式,包括工作分解模式和程序结构模式。
共享内存编程:讨论了两种不同的共享内存并行编程方法——显式并行化和隐式并行化。在显式方面,第3章覆盖了线程和两种最常用的同步机制——信号和monitor。对于通常遇到的设计模式(如生产者–消费者模式和读者–写者模式),均给出了详细解释并应用于一系列示例中。
在隐式方面,第4章介绍了OpenMP标准,该标准的设计使得我们能以最少的工作量将现有串行代码并行化。它可使开发时间大大缩短。该标准还有其他的好处,如解决了循环间存在的依赖。
分布式内存编程:第5章介绍了分布式内存并行编程的事实标准——消息传递接口(MPI)。MPI同多核编程相关,因为它旨在把程序从一个共享内存多核机器上扩展到一个具有上百万节点的超级计算机上。就其本身而言,MPI能够为利用多核机器的多重分解提供基础,以作为独立的虚拟平台。
这部分涉及的特征包括点对点通信和集合通信,也包括单边通信。有一节内容专门针对Boost.MPI库,虽然还未实现全部的功能,但它的确简化了使用MPI的过程。
GPU编程:GPU是把本书内容组织在一起的最初原因之一。以此类推到共享内存编程,这里从两个方面讨论了针对GPU软件开发的问题。一方面是NVIDIA的CUDA中的具体方法,该方法中的内存传输、数据放置和线程执行配置都需要仔细计划。这将在第6章进行介绍。
另一方面是高级的Thrust模板库算法方法,这部分在第7章中讨论。程序设计的类标准模板库(STL-like)方法为Thrust提供了把CPU和GPU平台均作为目标的能力,在本书所介绍的工具中,这是一个独特的特性。
负载均衡:第8章讨论在多核开发中经常被低估的一个方面。一般来说,一旦异构计算资源开始运行,就应该认真考虑负载均衡。举例来说,一个CPU和一个GPU构成这一组资源,我们在满足需求时不能只考虑一群不同机器的集合。第8章简要讨论了Linda语言,这可以被看做动态负载均衡的高级抽象。
书中主要的关注点在静态负载均衡,以及可以用于驱动负载分区和数据通信序列的数学模型。
很多场景中都应用了一种已经得到认可的方法论——可分负载理论(DLT),并且给出了解释。书中还介绍了一个简单的C++库,它实现了部分过去20年中已经发表过的DLT研究结果。
软件和硬件要求
书中的示例都是在Ubuntu Linux系统上开发和测试的。本书中使用的所有软件都是可以免费获取或者是开源的。其中包括:
GNU C/C++ 编译器组件 4.8.x(兼容 CUDA),组件4.9.x (兼容OpenMP 4.0)
Digia的 Qt 4.x 库或者Qt 5.x 库
OpenMPI 1.6
MPE
NVIDIA的 CUDA SDK 6.5
Thrust 库 (版本1.7)
如果拥有近期正确安装的Linux,并装有版本等于或高于上述软件列表中版本号的软件,那么执行本书中提供的示例代码应该不会有任何问题。虽然我没有提供Windows平台下的生成文件或者使用Visual Studio编译和执行示例代码的指令,但未安装Linux的用户只需进行少量代码改动就可以把示例移植到Windows上。考虑到我们使用的是标准C/C++库,因此对于代码的改动(如果存在)应该只会影响头文件,也就是那些需要被包括的(include)文件。
硬件部分唯一的实际局限是需要计算能力为2.x或者更高的NVIDIA GPU。早期芯片也可以使用,但是它们的独特性,尤其是关于全局内存的访问,在书中没有给出解释。没有NVIDIA GPU的用户可以通过使用附录E中介绍的方法来成功执行CUDA程序。
示例代码
书中的程序可在Elsevier网站(http://store.elsevier.com/9780124171374)上获取压缩包。
程序存放在特定的文件夹中,以章名区分,如图1所示。
对于书中的代码清单,均在第1行给出了相对于该章目录的对应文件的位置。
单文件程序的第一行注释里包含编译和链接命令。多文件项目存放在它们自己的目录中,其中也包含一个生成文件或者一个项目(.pro)文件。如果需要输入样本值,该部分数据也在该目录下的文件中提供。

图1 截屏显示了示例代码在特定章节的文件夹中的组织方式
教学建议
本书中所涉及的内容适合高年级本科生或者研究生课程。学生需要具备的背景知识包括掌握C和C++编程(两种语言的使用贯穿整本书)、基本的操作系统概念,以及基本的计算机体系结构常识。
根据各自的需求,教师可以选择使用以下列出的一些教学建议。前两章是为后面的章节奠定基础,因此它们在所有的路径中都包括:
重点在并行编程(本科生):
第1章:Flynn分类法、当代的多核设备、性能标准。1.1~1.5节。
第2章:设计、PCAM方法论、分解模式、程序结构模式。2.1~2.5节。
第3章:线程、信号、monitor。3.1~3.7节。
第4章:OpenMP的基本概念、工作共享结构, 4.1~4.4节。
第5章:MPI、点对点通信、集合操作、目标/结构通信,以及调试和性能分析。5.1~5.12节、5.15~5.18节和5.20节。
第6章:CUDA编程模型,内存层次结构,针对GPU的优化。6.1~6.6节、 6.7.1节、6.7.3节、 6.7.6节、6.9~6.11节和6.12.1节。
第7章:Thrust基本的知识。7.1~7.4节。
第8章:负载均衡。8.1~8.3节。
重点在多核编程(本科生):
第1章:Flynn分类法、当代的多核设备、性能标准。1.1~1.5节。
第2章:设计、PCAM方法论、分解模式、程序结构模式。2.1~2.5节。
第3章:线程、信号、monitor。3.1~3.10节。
第4章:基本的OpenMP、工作共享结构,以及正确性和性能问题。4.1~4.8节。
第5章:MPI,点对点通信、集合操作、目标/结构通信,以及调试和性能分析。5.1~5.12节、 5.16~5.18节和5.21节。
第6章:CUDA编程模型、内存层次结构,以及针对GPU的优化。6.1~6.10节、 6.12.1节。
第7章: Thrust基本的知识。7.1~7.4节。
第8章:负载均衡。8.1~8.3节。
高级多核编程:
第1章:Flynn分类法、当代的多核设备、性能标准。1.1~1.5节。
第2章:设计、PCAM方法论、分解模式、程序结构模式。2.1~2.5节。
第3章:线程、信号、monitor、高级线程管理。3.1~3.10节。
第4章:OpenMP基本的知识,工作共享结构,以及正确性和性能问题。4.1~4.8节。
第5章:MPI、点对点通信、集合操作、目标/结构通信,以及调试和性能分析。5.1~5.12节、 5.15~5.18节和 5.21~5.22节。
第6章:CUDA编程模型、内存层次结构,以及针对GPU的优化。6.1~6.12节。
第7章:Thrust数据类型和算法。7.1~7.7节。
第8章:负载均衡、基于DLT的分割。8.1~8.5节。

上架指导

计算机\高性能计算

封底文字

本书涵盖了当前主要的并行计算关键技术,包括多核CPU编程、大规模并行的众核GPU计算。本书详细讨论了如何使用线程、OpenMP、MPI、CUDA和Thrust设计与开发软件,以充分利用当今异构计算平台上的丰富计算资源。本书凝结了作者十多年并行计算的教学经验,不仅充分说明了从串行编程到并行计算的转变方式,还提供了大量示例和案例研究。通过本书,读者可以学习如何使用MPI开发运行在分布式内存系统上的应用程序,如何使用库或者指令创建多核应用,如何编写在可用计算资源间实现负载均衡的优化程序,以及如何针对目标多核平台进行程序剖析和调试。

本书主要特色:

·涵盖所有主流多核编程工具,包括线程、OpenMP、MPI和CUDA。
·涵盖多种针对并行软件开发效率的工具和库,包括Qt线程、Thrust和Boost.MPI。
·涵盖重要并行编程设计模式的实现。
·讨论了如何融合不同的工具和范式提升程序性能。
·结合案例研究详细讨论了本书涵盖的内容,并提供了完整的源代码。
·使用启发式和分析的方法检查负载均衡,并详细说明了可分负载理论。

作者简介

[阿联酋] 杰拉西莫斯?巴拉斯(Gerassimos Barlas) 著:暂无简介

译者简介

张云泉 贾海鹏 李士刚 袁良 等译:暂无简介

译者序

由于功耗墙、散热墙等因素的限制,单纯提升单核处理器的性能已经越来越困难,因此多核/众核架构成为计算机体系结构发展的重要趋势。然而,多核/众核处理器在带来更高计算能力的同时,也增加了并行软件开发、分析和优化的难度。随着多核/众核处理器的普及以及并行计算集群应用的日益广泛,如何编写正确、高效的并行程序已经成为软件开发人员面临的一大挑战,同时并行程序的调试、剖析也日益成为并行软件开发的难题。并行程序开发和优化的本质是实现算法特征向底层硬件架构特征的高效映射,这就对并行软件开发人员提出了更高的要求,他们不仅要了解算法特征,还要对底层架构有着清晰的认识。这无疑增加了并行软件开发的难度。
本书作者Gerassimos Barlas博士是阿联酋沙迦美国大学计算机科学与工程系的教授,其研究方向包括并行算法及并行软件的设计与开发、负载均衡模型框架研究等。Gerassimos Barlas博士具有10年以上的并行软件开发和教学经验,并且在并行与分布式系统的可分负载理论等领域非常活跃。
本书从并行软件的实现、调试、优化和剖析四个方面,详细讨论了当前主要的并行计算关键技术,包括CPU多核编程、分布式内存编程、GPU编程、负载均衡等。同时针对并行软件的开发效率,本书也详细介绍了Qt 线程、Thrust和Boost MPI等库和工具。面对当今异构计算平台的架构特点,书中既讲解了选择合适的工具开发高性能并行软件的步骤和方法,同时提供了大量的实际案例,更加深入地讨论不同编程和优化技术的应用方法。通过阅读本书,读者可以学习:如何使用库或者指令制导方式创建多核应用,如何使用MPI开发运行在分布式内存系统上的应用程序,如何使用CUDA开发高性能GPU程序,如何实现负载均衡,以及如何针对目标多核平台进行程序剖析和调试等。总之,本书作者根据自己多年的并行编程经验,从开发优秀并行软件的本质出发,以通俗易懂的方式对最为关键的基本知识和技术进行了细致讲解。本书既可成为并行软件初学者的参考书籍,也可供具有一定并行编程经验的软件开发人员参考。
由于时间仓促,而且书中某些术语目前业界没有统一译法,所以我们对一些术语采取了保留其英文名称的方法。书中翻译方面的错误和不妥之处,恳请广大读者不吝批评指正。

译者

图书目录

译者序
前 言
第1章 概述 1
1.1 多核计算机时代 1
1.2 并行计算机的分类 3
1.3 现代计算机概览 4
1.3.1 Cell BE处理器 5
1.3.2 NVIDIA Kepler 6
1.3.3 AMD APU 9
1.3.4 从多核到众核:Tilera TILE-Gx8072和Intel Xeon Phi 10
1.4 性能指标 12
1.5 并行程序性能的预测与测量 16
1.5.1 Amdahl定律 18
1.5.2 Gustafson-Barsis定律 20
第2章 多核和并行程序设计 23
2.1 引言 23
2.2 PCAM方法学 24
2.3 分解模式 26
2.3.1 任务并行 27
2.3.2 分而治之分解 28
2.3.3 几何分解 30
2.3.4 递归数据分解 32
2.3.5 流水线分解 35
2.3.6 基于事件的合作分解 39
2.4 程序结构模式 39
2.4.1 单程序多数据 40
2.4.2 多程序多数据 40
2.4.3 主/从 41
2.4.4 map-reduce 41
2.4.5 fork/join 42
2.4.6 循环并行 44
2.5 匹配分解模式和程序结构模式 44
第3章 共享内存编程:线程 46
3.1 引言 46
3.2 线程 48
3.2.1 线程的定义 48
3.2.2 线程的作用 49
3.2.3 线程的生成和初始化 49
3.2.4 在线程间共享数据 55
3.3 设计考虑 57
3.4 信号量 58
3.5 经典问题中的信号量 62
3.5.1 生产者–消费者 63
3.5.2 终止处理 66
3.5.3 理发师问题:引入公平性 75
3.5.4 读者–写者问题 80
3.6 monitor 84
3.6.1 设计方法1:monitor内部的关键区 87
3.6.2 设计方法2:monitor控制关键区的入口 87
3.7 经典问题中的monitor 91
3.7.1 重新考虑生产者–消费者问题 91
3.7.2 重新考虑读者–写者问题 95
3.8 动态线程管理与静态线程管理 102
3.8.1 Qt线程池 102
3.8.2 线程池的创建和管理 103
3.9 调试多线程应用 111
3.10 高层次结构:无须显式利用线程的多线程编程 115
3.10.1 并发map 116
3.10.2 map-reduce 118
3.10.3 并发过滤 120
3.10.4 filter-reduce 121
3.10.5 案例研究:多线程存储 122
3.10.6 案例研究:多线程图像匹配 131
第4章 共享内存编程:OpenMP 140
4.1 引言 140
4.2 第一个OpenMP程序 141
4.3 变量作用域 144
4.3.1 定积分OpenMP版本V.0:人工划分 146
4.3.2 定积分OpenMP版本 V.1:无竞争条件的人工划分 147
4.3.3 定积分OpenMP V.2:基于锁的隐式划分 148
4.3.4 定积分OpenMP V.3:基于归约的隐式划分 150
4.3.5 变量作用域总结 151
4.4 循环级并行 152
4.4.1 数据依赖 154
4.4.2 嵌套循环 162
4.4.3 调度 162
4.5 任务并行 166
4.5.1 sections指令 166
4.5.2 task指令 171
4.6 同步结构 177
4.7 正确性与优化问题 183
4.7.1 线程安全 183
4.7.2 假共享 187
4.8 案例研究:OpenMP中的排序算法 192
4.8.1 自下而上归并排序算法的OpenMP实现 192
4.8.2 自上而下归并排序算法的OpenMP实现 195
4.8.3 性能评估 200
第5章 分布式内存编程 203
5.1 通信进程 203
5.2 MPI 204
5.3 核心概念 205
5.4 你的第一个MPI程序 206
5.5 程序体系结构 208
5.5.1 SPMD 208
5.5.2 MPMD 209
5.6 点对点通信 210
5.7 可选的点对点通信模式 214
5.8 非阻塞通信 216
5.9 点对点通信小结 220
5.10 错误报告与处理 220
5.11 集合通信简介 222
5.11.1 分发 226
5.11.2 收集 231
5.11.3 归约 233
5.11.4 多对多收集 237
5.11.5 多对多分发 240
5.11.6 多对多归约 245
5.11.7 全局同步 245
5.12 通信对象 245
5.12.1 派生数据类型 246
5.12.2 打包/解包 253
5.13 节点管理:通信器和组 254
5.13.1 创建组 255
5.13.2 建立内部通信器 257
5.14 单边通信 259
5.14.1 RMA通信函数 261
5.14.2 RMA同步函数 262
5.15 I/O注意事项 270
5.16 MPI多进程和多线程混合编程 276
5.17 时序和性能测量 279
5.18 调试和分析MPI程序 279
5.19 Boost.MPI库 283
5.19.1 阻塞和非阻塞通信 285
5.19.2 数据序列化 289
5.19.3 集合通信 292
5.20 案例研究:有限扩散聚合模型 295
5.21 案例研究:暴力加密破解 300
5.21.1 版本1:“基本型”MPI 300
5.21.2 版本2:MPI与OpenMP的结合 305
5.22 案例研究:主/从式并行模型的MPI实现 308
5.22.1 简单主/从式设置 309
5.22.2 多线程主/从式设置 316
第6章 GPU编程 333
6.1 GPU编程简介 333
6.2 CUDA编程模型:线程、线程块、线程网格 335
6.3 CUDA执行模型:流多处理器和warp 340
6.4 CUDA程序编译过程 344
6.5 构建CUDA项目 347
6.6 内存层次结构 349
6.6.1 本地内存/寄存器 355
6.6.2 共享内存 356
6.6.3 常量内存 363
6.6.4 texture和surface内存 368
6.7 优化技术 369
6.7.1 线程组织设计 369
6.7.2 kernel结构 378
6.7.3 共享内存访问 382
6.7.4 全局内存访问 388
6.7.5 page-locked与zero-copy内存 392
6.7.6 统一内存 394
6.7.7 异步执行和流 397
6.8 动态并行 403
6.9 CUDA程序的调试 407
6.10 CUDA程序剖析 410
6.11 CUDA和MPI 412
6.12 案例研究 417
6.12.1 分形集合计算 417
6.12.2 块加密算法 426
第7章 Thrust模板库 452
7.1 引言 452
7.2 使用Thrust的第一步 453
7.3 Thrust数据类型 456
7.4 Thrust算法 459
7.4.1 变换算法 460
7.4.2 排序与查询 463
7.4.3 归约 468
7.4.4 scan /前缀和 471
7.4.5 数据管理与处理 472
7.5 花式迭代器 475
7.6 交换设备后端 480
7.7 案例研究 481
7.7.1 蒙特卡洛积分 481
7.7.2 DNA序列比对 485
第8章 负载均衡 493
8.1 引言 493
8.2 动态负载均衡:Linda的遗赠 494
8.3 静态负载均衡:可分负载理论方法 495
8.3.1 建模开销 496
8.3.2 通信设置 502
8.3.3 分析 503
8.3.4 总结 :简短的文献综述 510
8.4 DLTlib:分割工作负载的库 513
8.5 案例研究 516
8.5.1 Mandelbrot集“电影”的混合计算:动态负载均衡案例研究 516
8.5.2 分布式块加密:静态负载均衡案例研究 526
在线资源
附录A 编译Qt程序
附录B 运行MPI程序:准备与配置步骤
附录C 测量时间
附录D Boost.MPI
附录E CUDA环境搭建
附录F DLTlib
术语表
参考文献

教学资源推荐
作者: 贾春福 钟安鸣 杨骏 编著
作者: [德]贝蒂尔·施密特(Bertil Schmidt) [西]豪尔赫·冈萨雷斯-多明格斯(Jorge González-Domínguez) [德]克里斯蒂安·洪特(Christian Hundt) [德]莫里茨·施拉布(Moritz Schlarb) 著
作者: James D.Foley,Andries van Dam,Steven K.Feiner,John F.Hughes,Richard L. Phillips
参考读物推荐
作者: 甘登岱 郭玲文
作者: 华诚科技 编著
作者: 华诚科技 编著