第一部分 并行程序设计基础 3
第1章 并行计算机 3
1.1 并行计算机的分类 3
1.1.1 指令与数据 3
1.1.2 存储方式 4
1.2 物理问题在并行机上的求解 5
1.3 小结 6
第2章 并行编程模型与并行语言 7
2.1 并行编程模型 7
2.2 并行语言 8
2.3 小结 9
第3章 并行算法 10
3.1 并行算法分类 10
3.2 并行算法的设计 11
3.3 小结 12
第二部分 基本的MPI并行程序设计 15
第4章 MPI简介 15
4.1 什么是MPI 15
4.2 MPI的目的 16
4.3 MPI的产生 16
4.4 MPI的语言绑定 17
4.5 目前主要的MPI实现 17
4.6 小结 18
第5章 第一个MPI程序 19
5.1 MPI实现“Hello World!” 19
5.1.1 用FORTRAN 77+MPI实现 19
5.1.2 用C+MPI实现 21
5.2 MPI程序的一些惯例 24
5.3 小结 24
第6章 六个接口构成的MPI子集 25
6.1 子集介绍 25
6.1.1 MPI调用的参数说明 25
6.1.2 MPI初始化 27
6.1.3 MPI结束 27
6.1.4 当前进程标识 27
6.1.5 通信域包含的进程数 28
6.1.6 消息发送 28
6.1.7 消息接收 29
6.1.8 返回状态status 29
6.1.9 一个简单的发送和接收的例子 30
6.2 MPI预定义数据类型 31
6.3 MPI数据类型匹配和数据转换 32
6.3.1 MPI类型匹配规则 32
6.3.2 数据转换 34
6.4 MPI消息 35
6.4.1 MPI消息的组成 35
6.4.2 任意源和任意标识 36
6.4.3 MPI通信域 37
6.5 小结 37
第7章 简单的MPI程序示例 38
7.1 用MPI实现计时功能 38
7.2 获取机器的名字和MPI版本号 40
7.3 是否初始化及错误退出 41
7.4 数据接力传送 43
7.5 任意进程间相互问候 45
7.6 任意源和任意标识的使用 47
7.7 编写安全的MPI程序 49
7.8 小结 51
第8章 MPI并行程序的两种基本模式 52
8.1 对等模式的MPI程序设计 52
8.1.1 问题描述——Jacobi迭代 52
8.1.2 用MPI程序实现Jacobi迭代 53
8.1.3 用捆绑发送接收实现Jacobi迭代 56
8.1.4 引入虚拟进程后Jacobi迭代的实现 61
8.2 主从模式的MPI程序设计 63
8.2.1 矩阵向量乘 63
8.2.2 主进程打印各从进程的消息 66
8.3 小结 69
第9章 不同通信模式MPI并行程序的设计 70
9.1 标准通信模式 70
9.2 缓存通信模式 71
9.3 同步通信模式 75
9.4 就绪通信模式 77
9.5 小结 80
第10章 MPICH的安装与MPI程序的运行 81
10.1 Linux环境下的MPICH 81
10.1.1 安装 81
10.1.2 主要目录介绍 82
10.1.3 编译命令 83
10.1.4 执行步骤 83
10.1.5 放权 84
10.1.6 运行命令和配置文件 84
10.1.7 其他可执行命令 88
10.2 Windows NT环境下的MPICH 88
10.2.1 安装 88
10.2.2 编译 89
10.2.3 配置和运行 89
10.2.4 小结 92
第11章 常见错误 93
11.1 程序设计中的错误 93
11.2 运行时的错误 95
11.3 小结 95
第三部分 高级MPI并行程序设计 99
第12章 非阻塞通信MPI程序设计 99
12.1 阻塞通信 99
12.2 非阻塞通信简介 100
12.3 非阻塞标准发送和接收 102
12.4 非阻塞通信与其他三种通信模式的组合 104
12.5 非阻塞通信的完成 105
12.5.1 单个非阻塞通信的完成 105
12.5.2 多个非阻塞通信的完成 106
12.6 非阻塞通信对象 109
12.6.1 非阻塞通信的取消 109
12.6.2 非阻塞通信对象的释放 110
12.7 消息到达的检查 111
12.8 非阻塞通信有序接收的语义约束 114
12.9 用非阻塞通信来实现Jacobi迭代 114
12.10 重复非阻塞通信 117
12.11 用重复非阻塞通信来实现Jacobi迭代 121
12.12 小结 124
第13章 组通信MPI程序设计 125
13.1 组通信概述 125
13.1.1 组通信的消息通信功能 125
13.1.2 组通信的同步功能 126
13.1.3 组通信的计算功能 127
13.2 广播 127
13.3 收集 128
13.4 散发 131
13.5 组收集 133
13.6 全互换 136
13.7 同步 139
13.8 归约 140
13.9 MPI预定义的归约操作 141
13.10 求π值 142
13.11 组归约 144
13.12 归约并散发 145
13.13 扫描 146
13.14 不同类型归约操作的简单对比 147
13.15 不正确的组通信方式 148
13.16 MINLOC和MAXLOC 150
13.17 用户自定义归约操作 152
13.18 小结 154
第14章 具有不连续数据发送的MPI程序设计 155
14.1 派生数据类型 155
14.2 新数据类型的定义 156
14.2.1 连续复制的类型生成 156
14.2.2 向量数据类型的生成 157
14.2.3 索引数据类型的生成 159
14.2.4 结构数据类型的生成 161
14.2.5 新类型递交和释放 163
14.3 地址函数 164
14.4 与数据类型有关的调用 165
14.5 下界标记类型和上界标记类型 167
14.6 打包与解包 169
14.7 小结 174
第15章 MPI的进程组和通信域 175
15.1 简介 175
15.2 进程组的管理 176
15.3 通信域的管理 180
15.4 组间通信域 183
15.5 属性信息 186
15.6 小结 191
第16章 具有虚拟进程拓扑的MPI程序设计 192
16.1 虚拟拓扑简介 192
16.2 笛卡儿拓扑 193
16.3 图拓扑 198
16.4 再看Jacobi迭代的例子 200
16.5 小结 204
第17章 MPI对错误的处理 205
17.1 与错误处理有关的调用 205
17.2 小结 207
第18章 MPI函数调用原型列表与简单解释 208
18.1 MPI-1与C语言的接口 208
18.2 MPI-1与FORTRAN语言的接口 217
18.3 MPI-2与C语言的接口 229
18.4 MPI-2与FORTRAN语言的接口 240
18.5 小结 257
第四部分 MPI的最新发展MPI-2 261
第19章 动态进程管理 261
19.1 组间通信域 261
19.2 动态创建新的MPI进程 263
19.3 独立进程间的通信 265
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 窗口同步管理 274
20.3.1 栅栏方式 275
20.3.2 握手方式 275
20.3.3 锁方式 277
20.4 小结 279
第21章 并行I/O 280
21.1 概述 280
21.2 并行文件管理的基本操作 282
21.3 显式偏移的并行文件读写 285
21.3.1 阻塞方式 285
21.3.2 非阻塞方式 287
21.3.3 两步非阻塞组调用 289
21.4 多视口的并行文件并行读写 291
21.4.1 文件视口与指针 291
21.4.2 阻塞方式的视口读写 295
21.4.3 非阻塞方式的视口读写 297
21.4.4 两步非阻塞视口组调用方式 298
21.5 共享文件读写 300
21.5.1 阻塞共享文件读写 300
21.5.2 非阻塞共享文件读写 302
21.5.3 两步非阻塞共享文件组读写 303
21.6 分布式数组文件的存取 307
21.7 小结 310
网上资源 311
参考文献 312
英汉术语对照表 314
MPI调用索引 316
程序索引 321
图索引 323
表索引 326
附录1 MPI常量列表 327
附录2 MPICH 1.2.1函数列表 332