高性能计算之并行编程技术
—— MPI并行程序设计
都志辉 编著
李三立 审
陈渝 刘鹏 校
I
内容提要
本书介绍目前最常见的并行程序 —MPI并行程序的设计方法 它适合高校三四年级本科
生 非计算机专业研究生作为教材和教学自学参考书 也适合于广大的并行计算 高性能计
算 用户作为自学参考书使用 对于有FORTRAN和C编程经验的人员 都可以阅读并掌握
本书的内容
首先介绍了并行程序设计的基础 提供给读者进行并行程序设计所需要的基本知识 然
后介绍了MPI的基本功能 从简单的例子入手 告诉读者MPI程序设计的基本过程和框架
这一部分是具有C或/FORTRAN串行程序设计经验的人员很容易理解和接受的 接下来介绍
MPI程序设计的高级特征 是已经掌握了MPI基本程序设计的人员进一步编写简洁 高效的
MPI程序 使用各种高级和复杂的MPI功能所需要的 最后一部分介绍了MPI的最新发展和
扩充MPI-2 主要包括三个部分 动态进程管理 远程存储访问和并行文件读写
本书包括了MPI-1的全部调用和MPI-2的关键扩充部分的调用 并附以大量的图表和示
例性程序 对程序的关键部分给出了讲解或注释 读者若能将例子和对MPI调用的讲解结合
起来学习 会取得更好的效果
本书的目的 不仅是教给读者如何去编写从简单到复杂的MPI并行程序 更重要的是
希望在学习本书之后 在读者以后解决问题的过程中 能够树立并行求解的概念 使并行方
法真正成为广大应用人员和程序开发员手中的重要工具
II
目录
序......................................................................................................................................................................IX
前言................................................................................................................................................................... X
程 序 列 表..........................................................................................................................................................XI
图列表...........................................................................................................................................................XIII
表 格 列 表.......................................................................................................................................................XVI
第 一 部 分 并行程序设计基础 ........................................................................................................................1
第1章 并行计算机......................................................................................................................................2
1.1 并行计算机的分类 ..........................................................................................................................2
1.1.1 指令与数据....................................................................................................................................2
1.1.2 存储方式 .......................................................................................................................................3
1.2 物理问题在并行机上的求解 .........................................................................................................4
1.3 小结 ...................................................................................................................................................5
第2章 并行编程模型与并行语言.............................................................................................................6
2.1 并行编程模型 ..................................................................................................................................6
2.2 并行语言...........................................................................................................................................7
2.3 小结 ...................................................................................................................................................8
第3章 并行算法..........................................................................................................................................9
3.1 并行算法分类 ..................................................................................................................................9
3.2 并行算法的设计..............................................................................................................................9
3.3 小结 ................................................................................................................................................. 11
第 二 部 分 基本的MPI并行程序设计..........................................................................................................12
第4章 MPI简介 .........................................................................................................................................13
4.1 什么是MPI......................................................................................................................................13
4.2 MPI的目的 ......................................................................................................................................13
4.3 MPI的产生 ......................................................................................................................................14
4.4 MPI的语言绑定..............................................................................................................................14
4.5 目前主要的MPI实现.....................................................................................................................15
4.6 小结 .................................................................................................................................................15
第5章 第一个MPI程序.............................................................................................................................16
5.1 MPI实现的 Hello World!” ..........................................................................................................16
5.1.1 用FORTRAN77+MPI实现 ...........................................................................................................16
5.1.2 用C+MPI实现..............................................................................................................................18
5.2 MPI程序的一些惯例......................................................................................................................21
5.3 小结 .................................................................................................................................................22
第6章 六个接口构成的MPI子集............................................................................................................23
6.1 子集介绍.........................................................................................................................................23
6.1.1 MPI调用的参数说明 ....................................................................................................................23
III
6.1.2 MPI初始化 ...................................................................................................................................25
6.1.3 MPI结束.......................................................................................................................................25
6.1.4 当前进程标识..............................................................................................................................25
6.1.5 通信域包含的进程数...................................................................................................................26
6.1.6 消息发送 .....................................................................................................................................26
6.1.7 消息接收 .....................................................................................................................................27
6.1.8 返回状态status.............................................................................................................................27
6.1.9 一个简单的发送和接收的例子....................................................................................................28
6.2 MPI预定义数据类型......................................................................................................................29
6.3 MPI数据类型匹配和数据转换.....................................................................................................30
6.3.1 MPI类型匹配规则........................................................................................................................30
6.3.2 数据转换 .....................................................................................................................................32
6.4 MPI消息...........................................................................................................................................33
6.4.1 MPI消息的组成............................................................................................................................33
6.4.2 任意源和任意标识 ......................................................................................................................34
6.4.3 MPI通信域 ...................................................................................................................................35
6.5 小结 .................................................................................................................................................35
第7章 简单的MPI程序示例 ....................................................................................................................36
7.1 用MPI实现计时功能.....................................................................................................................36
7.2 获取机器的名字和MPI版本号 ....................................................................................................38
7.3 是否初始化及错误退出................................................................................................................39
7.4 数据接力传送 ................................................................................................................................41
7.5 任意进程间相互问候....................................................................................................................43
7.6 任意源和任意标识的使用............................................................................................................46
7.7 编写安全的MPI程序.....................................................................................................................47
7.8 小结 .................................................................................................................................................50
第8章 MPI并行程序的两种基本模式....................................................................................................51
8.1 对等模式的MPI程序设计 ............................................................................................................51
8.1.1 问题描述 — Jacobi迭代 ................................................................................................................51
8.1.2 用MPI程序实现Jacobi迭代..........................................................................................................52
8.1.3 用捆绑发送接收实现Jacobi迭代 .................................................................................................55
8.1.4 引入虚拟进程后Jacobi迭代的实现..............................................................................................60
8.2 主从模式的MPI程序设计 ............................................................................................................62
8.2.1 矩阵向量乘..................................................................................................................................62
8.2.2 主进程打印各从进程的消息 .......................................................................................................65
8.3 小结 .................................................................................................................................................68
第9章 不同通信模式MPI并行程序的设计...........................................................................................69
9.1 标准通信模式 ................................................................................................................................69
9.2 缓存通信模式 ................................................................................................................................70
9.3 同步通信模式 ................................................................................................................................74
9.4 就绪通信模式 ................................................................................................................................76
9.5 小结 .................................................................................................................................................79
第10章 MPICH的安装与MPI程序的运行.............................................................................................80
10.1 Linux环境下的MPICH.................................................................................................................80
IV
10.1.1 安装...........................................................................................................................................80
10.1.2 主要目录介绍............................................................................................................................81
10.1.3 编译命令 ...................................................................................................................................82
10.1.4 执行步骤 ...................................................................................................................................82
10.1.5 放权...........................................................................................................................................83
10.1.6 运行命令和配置文件.................................................................................................................83
10.1.7 其它可执行命令 ........................................................................................................................86
10.2 Windows NT环境下的MPICH .....................................................................................................87
10.2.1 安装...........................................................................................................................................87
10.2.2 编译...........................................................................................................................................87
10.2.3 配置和运行................................................................................................................................88
10.2.4 小结...........................................................................................................................................91
第11章 常见错误 ......................................................................................................................................92
11.1 程序设计中的错误......................................................................................................................92
11.2 运行时的错误...............................................................................................................................93
11.3 小结 ...............................................................................................................................................94
第 三 部 分 高级MPI并行程序设计..............................................................................................................95
第12章 非阻塞通信MPI程序设计..........................................................................................................96
12.1 阻塞通信.......................................................................................................................................96
12.2 非阻塞通信简介..........................................................................................................................97
12.3 非阻塞标准发送和接收..............................................................................................................99
12.4 非阻塞通信与其它三种通信模式的组合 ..............................................................................101
12.5 非阻塞通信的完成....................................................................................................................102
12.5.1 单个非阻塞通信的完成........................................................................................................... 102
12.5.2 多个非阻塞通信的完成........................................................................................................... 104
12.6 非阻塞通信对象........................................................................................................................107
12.6.1 非阻塞通信的取消 .................................................................................................................. 107
12.6.2 非阻塞通信对象的释放........................................................................................................... 109
12.7 消息到达的检查........................................................................................................................110
12.8 非阻塞通信有序接收的语义约束...........................................................................................112
12.9 用非阻塞通信来实现Jacobi迭代 ............................................................................................113
12.10 重复非阻塞通信 ......................................................................................................................116
12.11 用重复非阻塞通信来实现Jacobi迭代 ..................................................................................119
12.12 小结...........................................................................................................................................122
第13章 组通信MPI程序设计................................................................................................................123
13.1 组通信概述 ................................................................................................................................123
13.1.1 组通信的消息通信功能........................................................................................................... 123
13.1.2 组通信的同步功能 .................................................................................................................. 124
13.1.3 组通信的计算功能 .................................................................................................................. 125
13.2 广播.............................................................................................................................................126
13.3 收集.............................................................................................................................................127
13.4 散发.............................................................................................................................................130
13.5 组收集.........................................................................................................................................132
13.6 全互换.........................................................................................................................................135
V
13.7 同步.............................................................................................................................................138
13.8 归约.............................................................................................................................................139
13.9 MPI预定义的归约操作..............................................................................................................141
13.10 求p值.........................................................................................................................................142
13.11 组归约.......................................................................................................................................144
13.12 归约并散发 ..............................................................................................................................145
13.13 扫描...........................................................................................................................................146
13.14 不同类型归约操作的简单对比 .............................................................................................147
13.15 不正确的组通信方式..............................................................................................................149
13.16 MINLOC和MAXLOC................................................................................................................151
13.17 用户自定义归约操作..............................................................................................................153
13.18 小结...........................................................................................................................................155
第14章 具有不连续数据发送的MPI程序设计...................................................................................156
14.1 派生数据类型 ............................................................................................................................156
14.2 新数据类型的定义....................................................................................................................157
14.2.1 连续复制的类型生成............................................................................................................... 157
14.2.2 向量数据类型的生成............................................................................................................... 158
14.2.3 索引数据类型的生成............................................................................................................... 160
14.2.4 结构数据类型的生成............................................................................................................... 163
14.2.5 新类型递交和释放 .................................................................................................................. 164
14.3 地址函数.....................................................................................................................................171
14.4 与数据类型有关的调用............................................................................................................172
14.5 下界标记类型和上界标记类型...............................................................................................175
14.6 打包与解包 ................................................................................................................................177
14.7 小结.............................................................................................................................................181
第15章 MPI的进程组和通信域............................................................................................................182
15.1 简介.............................................................................................................................................182
15.2 进程组的管理 ............................................................................................................................182
15.3 通信域的管理 ............................................................................................................................187
15.4 组间通信域 ................................................................................................................................190
15.5 属性信息.....................................................................................................................................194
15.6 小结.............................................................................................................................................198
第16章 具有虚拟进程拓扑的MPI程序设计.......................................................................................199
16.1 虚拟拓扑简介 ............................................................................................................................199
16.2 笛卡儿拓扑 ................................................................................................................................199
16.3 图拓扑.........................................................................................................................................205
16.4 再看Jacobi迭代的例子.............................................................................................................208
16.5 小结.............................................................................................................................................212
第17章 MPI对错误的处理 ....................................................................................................................213
17.1 与错误处理有关的调用............................................................................................................213
17.2 小结.............................................................................................................................................215
第18章 MPI函数调用原型列表与简单解释.......................................................................................216
18.1 MPI-1与C语言的接口................................................................................................................216
18.2 MPI-1与Fortran语言的接口.....................................................................................................223
VI
18.3 MPI-2与C语言的接口................................................................................................................234
18.4 MPI-2与Fortran语言的接口.....................................................................................................243
18.5 小结.............................................................................................................................................258
第 四 部 分 MPI的最新发展MPI-2 ............................................................................................................259
第19章 动态进程管理............................................................................................................................260
19.1 组间通信域 ................................................................................................................................260
19.2 动态创建新的MPI进程.............................................................................................................262
19.3 独立进程间的通信....................................................................................................................264
19.4 基于socket的通信 ......................................................................................................................268
19.5 小结.............................................................................................................................................268
第20章 远程存储访问............................................................................................................................269
20.1 简介.............................................................................................................................................269
20.2 窗口的创建与窗口操作............................................................................................................270
20.2.1 创建窗口 ................................................................................................................................. 270
20.2.2 向窗口写 ................................................................................................................................. 271
20.2.3 从窗口读 ................................................................................................................................. 272
20.2.4 对窗口数据的运算 .................................................................................................................. 273
20.3 窗口同步管理 ............................................................................................................................275
20.3.1 栅栏方式 ................................................................................................................................. 275
20.3.2 握手方式 ................................................................................................................................. 276
20.3.3 锁方式 ..................................................................................................................................... 278
20.4 小结.............................................................................................................................................280
第21章 并行I/O.......................................................................................................................................281
21.1 概述.............................................................................................................................................281
21.2 并行文件管理的基本操作 .......................................................................................................282
21.3 显式偏移的并行文件读写 .......................................................................................................286
21.3.1 阻塞方式 ................................................................................................................................. 286
21.3.2 非阻塞方式.............................................................................................................................. 289
21.3.3 两步非阻塞组调用 .................................................................................................................. 291
21.4 多视口的并行文件并行读写 ...................................................................................................293
21.4.1 文件视口与指针 ...................................................................................................................... 294
21.4.2 阻塞方式的视口读写............................................................................................................... 298
21.4.3 非阻塞方式的视口读写........................................................................................................... 300
21.4.4 两步非阻塞视口组调用方式 ................................................................................................... 301
21.5 共享文件读写 ............................................................................................................................303
21.5.1 阻塞共享文件读写 .................................................................................................................. 304
21.5.2 非阻塞共享文件读写............................................................................................................... 306
21.5.3 两步非阻塞共享文件组读写 ................................................................................................... 307
21.6 分布式数组文件的存取............................................................................................................311
21.7 小结.............................................................................................................................................314
网 上 资 源........................................................................................................................................................315
参 考 文 献........................................................................................................................................................316
VII
中 英 文 术 语 对 照...........................................................................................................................................318
本书介绍的MPI调用索引...........................................................................................................................320
附录1
MPI常量列表.............................................................................................................................325
附录2
MPICH 1.2.1 函数列表..........................................................................................................329
VIII