本书主要介绍目前最常用的几种并行程序设计思路与方法,主要内容包括并行计算基础、OpenMP并行程序设计简介、MPI并行程序设计、CUDA并行程序设计及求解声波方程的并行程序五个部分。其中OpenMP对应共享内存的CPU并行编程,MPI对应消息传递的CPU并行编程,CUDA对应GPU编程。因此,通过对本书的学习,可以掌握目前最常用的几种并行编程方法。
样章试读
目录
- 目录
前言
第一篇 并行计算基础
第1章 并行计算机硬件基础 3
1.1 并行计算 3
1.1.1 并行计算的概念 3
1.1.2 并行计算与计算科学 3
1.1.3 当代科学与工程问题的计算需求 4
1.2 并行计算机硬件简介 4
1.2.1 并行计算机的发展历史 4
1.2.2 并行计算机的分类 8
1.2.3 并行计算机的体系结构 9
1.3 当代并行计算机系统简介 14
1.3.1 共享存储多处理机系统 15
1.3.2 分布存储多处理机系统 15
1.3.3 集群系统 17
1.4 并行计算机的一些基本性能指标 24
1.4.1 CPU和存储器的某些性能指标 24
1.4.2 通信开销 25
1.4.3 机器的成本、价格与性价比 26
第2章 并行程序设计基础 28
2.1 并行算法的基础知识 28
2.1.1 并行算法领域的一些基本概念 28
2.1.2 并行程序开发策略与并行算法的描述方法 30
2.1.3 并行算法中的同步与通信 31
2.2 并行程序设计模型 32
2.2.1 计算π的样本程序 32
2.2.2 数据并行模型 33
2.2.3 消息传递模型 34
2.2.4 共享变量模型 36
2.3 并行程序设计方法 38
2.3.1 PCAM并行程序设计思路 38
2.3.2 并行编程语言 41
第二篇 OpenMP并行程序设计简介
第3章 OpenMP介绍 55
3.1 什么是OpenMP 55
3.2 共享内存式并行计算 55
3.3 OpenMP的发展历程 56
3.4 Windows平台下OpenMP环境搭建 56
第4章 OpenMP指令结构 59
4.1 编译指导语句的一般形式 59
4.2 主要指令 60
4.3 主要子句 61
4.4 常用库函数 62
第5章 OpenMP常用指令的用法 63
5.1 数据管理 63
5.1.1 Private子句 63
5.1.2 Firstprivate/Lastprivate子句 64
5.1.3 Shared子句 65
5.1.4 Default子句 66
5.1.5 Threadprivate子句 67
5.1.6 Copyin、copyprivate子句 68
5.1.7 Reduction子句 69
5.2 并行控制 70
5.2.1 Parallel指令 70
5.2.2 For指令 75
5.2.3 Schedule子句 76
5.2.4 Sections指令 80
5.2.5 Single指令 82
5.3 同步管理 82
5.3.1 Critical指令 83
5.3.2 Atomic指令 84
5.3.3 Barrier指令 85
5.3.4 Ordered指令 86
5.3.5 Master指令 86
5.3.6 Flush指令 87
5.4 常用库函数 87
5.4.1 运行时库函数 87
5.4.2 锁管理 88
5.4.3 环境变量 90
第6章 OpenMP实例 91
6.1 循环实例 91
6.2 并行程序的优化 93
6.2.1 临界区实现 93
6.2.2 原子操作实现 95
6.2.3 归约实现 95
6.3 快速排序并行算法 96
第三篇 MPI并行程序设计
第7章 MPI编程基础 103
7.1 MPI简介 103
7.1.1 MPI的含义 103
7.1.2 MPI的目标 103
7.1.3 MPI的产生 103
7.1.4 MPI的语言绑定 104
7.1.5 目前MPI的主要实现 104
7.2 一个简单的MPI程序 105
7.2.1 MPI实现的“Hello World!” 105
7.2.2 MPI程序的框架结构 109
7.2.3 MPI程序的一些惯例 109
7.3 6个基本函数组成的MPI子集 109
7.3.1 子集介绍 109
7.3.2 MPI预定义的数据类型 114
7.3.3 MPI数据类型匹配 115
7.3.4 MPI消息 117
7.4 简单的MPI程序示例 118
7.4.1 求二维数据中各元素绝对值的最大值 119
7.4.2 用MPI实现计时功能 121
7.4.3 获取机器名字与MPI版本号 123
7.4.4 是否初始化及错误退出 124
7.4.5 环形消息传递 125
7.4.6 所有进程相互问候 126
7.4.7 任意源和任意标识的使用 128
7.4.8 编写安全的MPI程序 129
第8章 MPI的安装与并行编程环境的设置 132
8.1 Linux环境下的MPICH2安装与设置 132
8.2 Windows环境下MPICH2的安装与设置 133
8.2.1 安装 133
8.2.2 编译运行C+MPI程序 134
8.2.3 编译运行Fortran+MPI程序 138
第9章 对等模式与主从模式的MPI程序设计 141
9.1 对等模式MPI程序设计 141
9.1.1 问题描述——雅可比迭代 141
9.1.2 用MPI程序实现雅可比迭代 142
9.1.3 采用捆绑发送接收实现雅可比迭代 146
9.1.4 引入虚拟进程后雅可比迭代的实现 151
9.2 主从模式MPI程序设计 155
9.2.1 矩阵向量乘 155
9.2.2 主进程打印各从进程的消息 159
第10章 MPI的四种通信模式 162
10.1 标准通信模式 162
10.2 缓存通信模式 163
10.3 同步通信模式 165
10.4 就绪通信模式 167
第11章 MPI的非阻塞通信 170
11.1 非阻塞通信简介 170
11.1.1 阻塞通信 170
11.1.2 非阻塞通信 171
11.2 非阻塞标准发送与接收 173
11.3 非阻塞通信与其他三种通信模式的结合 174
11.4 非阻塞通信的完成与检测 175
11.4.1 单个非阻塞通信的完成与检测 175
11.4.2 多个非阻塞通信的完成与检测 176
11.5 非阻塞通信对象 178
11.5.1 非阻塞通信的取消 179
11.5.2 非阻塞通信对象的释放 180
11.5.3 消息到达的检查 181
11.5.4 用非阻塞通信来实现雅可比迭代 182
11.6 重复非阻塞通信 185
第12章 MPI的组通信调用 190
12.1 组通信概述 190
12.2 组通信的通信功能 191
12.2.1 广播 191
12.2.2 收集 192
12.2.3 散发 196
12.2.4 组收集 199
12.2.5 全互换 201
12.3 组通信的同步功能 204
12.4 组通信的计算功能 205
12.4.1 归约 205
12.4.2 MPI的内置归约算符 206
12.4.3 程序举例 207
12.4.4 组归约 209
12.4.5 归约并散发 211
12.4.6 扫描 212
12.4.7 不同类型归约操作的对比 213
12.4.8 MINLOC和MAXLOC 215
12.4.9 用户自定义的归约操作 216
第13章 MPI的派生数据类型 220
13.1 类型图 220
13.2 新数据类型的定义 221
13.2.1 MPI提供的数据类型生成器 221
13.2.2 新类型递交和释放 226
13.2.3 地址函数 227
13.2.4 与数据类型有关的调用 228
13.2.5 下界类型和上界类型 231
13.3 例题 232
13.4 打包与解包 236
第14章 MPI的进程组和通信域 239
14.1 简介 239
14.2 进程组和通信域的管理 239
14.2.1 MPI的进程组管理接口 240
14.2.2 通信域的管理 245
14.3 组间通信域 250
第15章 MPI扩展 255
15.1 MPI的动态进程管理 255
15.1.1 组间通信域 255
15.1.2 动态进程的创建 257
15.1.3 独立进程间的通信 260
15.1.4 基于socket的通信 263
15.2 MPI的远程存储访问 263
15.2.1 窗口创建与窗口操作 264
15.2.2 窗口同步管理 267
15.3 并行I/O 275
15.3.1 并行文件管理的基本操作 276
15.3.2 显式指定偏移量的并行文件读写 279
15.3.3 多视口的并行文件并行读写 283
15.3.4 共享文件指针读写 291
第16章 MPI函数调用原型与简单解释 297
16.1 MPI-1与C语言的接口 297
16.2 MPI-1与Fortran语言的接口 305
16.3 MPI-2与C语言的接口 314
16.4 MPI-2与Fortran语言的接口 324
第四篇 CUDA并行程序设计
第17章 GPU简介 339
17.1 NVIDIA GPU发展简介 339
17.2 GPU硬件架构 340
17.2.1 图形显卡概览 340
17.2.2 PCI-E总线 341
17.2.3 显存 342
17.2.4 GPU芯片 343
17.3 基于GPU的程序开发 344
17.3.1 传统GPU开发 344
17.3.2 CUDA开发 344
第18章 CUDA安装与编译 346
18.1 CUDA函数库与CUDA C++语言 346
18.1.1 CUDA API和函数库 346
18.1.2 CUDA C++语言 347
18.1.3 CUDA C++拓展限定符语法 348
18.2 CUDA的安装与配置 351
18.2.1 开发环境 351
18.2.2 安装平台 354
18.2.3 CUDA安装与配置 355
18.3 CUDA编译与驱动 357
18.3.1 Emu调试 357
18.3.2 编译相关 358
18.3.3 错误处理 359
18.3.4 计算模式 359
第19章 CUDA编程基础 360
19.1 主机与设备 360
19.2 核函数的定义与调用 362
19.3 设备中的空间管理与数据传输 363
19.4 线程结构 365
19.5 硬件映射 370
19.5.1 计算单元 370
19.5.2 Warp 372
19.5.3 执行模型 372
19.6 存储器类型 373
19.6.1 寄存器 374
19.6.2 局部存储器 375
19.6.3 共享存储器 376
19.6.4 全局存储器 377
19.6.5 常数存储器 380
19.6.6 纹理存储器 382
19.7 CUDA通信机制 387
19.7.1 Block内通信与同步机制 387
19.7.2 同步函数 389
19.7.3 Volatile关键字 393
19.7.4 ATOM操作 394
19.7.5 VOTE操作 395
第20章 CUDA程序优化 396
20.1 任务划分 396
20.2 Grid和block维度设计 397
20.3 存储器访问优化 400
20.3.1 全局存储器访问优化 400
20.3.2 共享存储器访问优化 402
20.3.3 使用纹理存储器和常数存储器加速 405
20.4 异步并行执行 405
20.4.1 简单异步函数使用 405
20.4.2 基于流的异步并行 406
第21章 CUDA与多设备集群 409
21.1 CUDA的设备控制 409
21.2 多设备并行 410
21.2.1 CUDA与MPI 411
21.2.2 CUDA与OpenMP 413
第五篇 求解声波方程的并行程序
第22章 声波方程有限差分正演模拟的并行实现 419
22.1 声波方程有限差分模拟算法 419
22.1.1 声波方程及差分格式 419
22.1.2 吸收边界条件 420
22.1.3 震源设置方法 422
22.1.4 二维声波方程正演模拟的实现步骤 423
22.2 声波方程有限差分模拟的串行程序 425
22.3 声波方程有限差分模拟的OpenMP程序 434
22.4 声波方程有限差分模拟的MPI程序 445
22.5 声波方程有限差分模拟的CUDA程序 455
22.6 声波方程有限差分模拟的MPI+CUDA程序 465
参考文献 478