内容简介
《多核与GPU编程:工具、方法及实践》从并行软件的实现、调试、优化和剖析四个方面,详细讨论了当前主要的并行计算关键技术,主要内容包括:多核和并行程序设计、共享内存编程中的线程与OpenMP、分布式内存编程、GPU编程、Thrust模板库、负载均衡等。本书结合具体的代码和案例分析,揭示了如何使用库或者指令创建多核应用,如何使用MPI开发分布式应用程序,如何使用CUDA开发高性能GPU程序,如何实现负载均衡,以及如何针对目标多核平台进行程序剖析和调试等。本书可供从事高性能计算技术研究的专业人员参考,也可作为高校相关专业的教学用书。
作者简介
Gerassimos Barlas 沙迦美国大学计算机科学与工程系教授。他的研究兴趣包括并行算法、开发、分析,以及负载平衡的建模框架,分布式视频点播。Barlas教授讲授并行编程课程已有12年时间,早在20世纪90年代,他就开始研究并行计算,并积极参与并行和分布式系统可分负载理论这一新领域的研究工作。
目录
译者序
前 言
第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
前言/序言
Preface 前 言 多核架构出现在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.6MPENVIDIA的 CUDA SDK 6.5Thrust 库 (版本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节。
多核与GPU编程:工具、方法及实践 电子书 下载 mobi epub pdf txt