1 并行计算概论 1
1.1 多核CPU 2
1.2 并行计算与分布式计算 2
1.3 并行计算机的种类 3
1.3.1 CPU与存储器的连接方式 3
1.3.2 数据的通信方式 4
1.3.3 指令和数据之间的工作方式 5
1.4 并行编程模式 5
1.4.1 共享内存模式 6
1.4.2 消息传递模式 7
1.4.3 数据并行模式 8
1.5 OpenMP和MPI的特点 10
1.6 并行计算中常用概念 11
1.6.1 程序、线程、进程和超线程 11
1.6.2 单核编程和多核编程 12
1.6.3 多线程编程和多进程编程 13
1.6.4 并行算法评价 13
1.7 OpenMP多核编程 15
1.7.1 OpenMP的历史 15
1.7.2 OpenMP的特点 16
1.8 科学计算领域语言的选取 16
1.9 Fortran发展历史 18
1.9.1 Windows系统 18
1.9.2 Linux系统 18
1.9.3 Fortran程序的编译和执行 19
1.10 小结 21
练习题 21
2 OpenMP编程简介 22
2.1 编译指导语句 23
2.2 并行执行模式 23
2.2.1 编译指导语句格式 24
2.2.2 主要指令 25
2.2.3 主要子句 26
2.2.4 指令和子句的配套使用 27
2.3 头文件 28
2.4 常用库函数 28
2.5 最简单的并行程序 29
2.6 小结 33
练习题 33
3 数据环境 34
3.1 PRIVATE子句、SHARED子句和DEFAULT子句 34
3.2 FIRSTPRIVATE子句和LASTPRIVATE子句 38
3.3 THREADPRIVATE子句 41
3.4 COPYIN子句和COPYPRIVATE子句 45
3.5 REDUCTION子句 49
3.6 伪共享 53
3.7 小结 54
练习题 54
4 并行控制 56
4.1 PARALLEL指令 56
4.2 设定线程数量 59
4.3 默认模式 59
4.4 静态模式 60
4.5 动态模式 61
4.6 嵌套模式与NUM_THREADS子句 63
4.7 IF子句(条件并行) 65
4.8 小结 67
练习题 68
5 并行构造 69
5.1 负载平衡 69
5.1.1 静态负载平衡 69
5.1.2 动态负载平衡 70
5.2 DO指令 71
5.2.1 循环依赖 73
5.2.2 单重循环 78
5.2.3 嵌套循环 80
5.2.4 循环工作量的划分与调度 83
5.3 SECTIONS指令 90
5.4 WORKSHARE指令 93
5.5 SINGLE指令 96
5.6 小结 98
练习题 98
6 线程同步 99
6.1 互斥锁机制 99
6.2 事件同步机制 100
6.3 BARRIER指令 100
6.4 NOWAIT指令 102
6.5 MASTER指令 104
6.6 CRITICAL指令 106
6.7 ATOMIC指令 108
6.8 ORDERED指令 110
6.9 FLUSH指令 113
6.10 小结 115
练习题 115
7 运行环境 117
7.1 环境变量 117
7.1.1 OMP_DYNAMIC 117
7.1.2 OMP_SCHEDULE 118
7.1.3 OMP_NUM_THREADS 118
7.1.4 OMP_NESTED 118
7.1.5 OMP_STACKSIZE 118
7.1.6 环境变量的设置方法 119
7.2 库函数 120
7.2.1 运行环境操作函数 120
7.2.2 OpenMP时间函数 121
7.2.3 Fortran常用时间函数 123
7.2.4 锁函数 129
7.3 小结 139
练习题 139
8 OpenMP 3.0新特征 140
8.1 任务 140
8.1.1 任务结构 140
8.1.2 任务特征 141
8.1.3 任务类别 141
8.1.4 任务同步 143
8.1.5 DO指令、SECTIONS指令和TASK指令 143
8.1.6 TASK指令与递归算法 151
8.2 COLLAPSE子句 154
8.3 锁拥有者的变迁 156
8.4 小结 157
练习题 157
9 应用实例 158
9.1 循环的并行 158
9.1.1 单重循环 159
9.1.2 多维数组和嵌套循环 167
9.2 粗粒度的设置 171
9.2.1 IF子句 171
9.2.2 if语句 173
9.2.3 方案总结 175
9.3 全局变量和局部变量 175
9.3.1 common定义 176
9.3.2 module定义 179
9.3.3 全局变量和局部变量、共享变量和私有变量 181
9.3.4 私有变量和段错误 182
9.4 小结 183
练习题 183
10 高性能计算程序的实现途径 185
10.1 硬件条件和操作系统 186
10.2 科学问题算法的优化 186
10.2.1 数学模型 187
10.2.2 求解方法 188
10.3 串行程序的编写 190
10.4 常见的调试器 191
10.5 高性能程序的优化步骤 191
10.6 串行程序的正确性调试 193
10.6.1 程序的错误类型 193
10.6.2 计算程序中常见错误 193
10.6.3 静态安全检查 194
10.6.4 动态安全检查 198
10.6.5 IDBC串行调试 200
10.7 程序热点的确定 206
10.7.1 编译器热点分析报告 206
10.7.2 手动热点分析报告 211
10.8 串行程序的优化 215
10.8.1 循环变换 216
10.8.2 向量化 219
10.8.3 Intel Fortran常用优化策略 230
10.9 并行程序的优化 236
10.9.1 性能提升的预估 236
10.9.2 并行优化步骤 236
10.9.3 向导自动并行化(GAP) 237
10.9.4 优化技术 238
10.9.5 自动并行化 238
10.9.6 并行调试策略 239
10.9.7 IDBC并行调试 240
10.10 小结 245
练习题 245
附录 246
附录1 常用的Linux命令 246
附录2 Linux下的文本编辑器vi 249
附录2.1 vi的基本概念 249
附录2.2 vi的主要操作 249
附录3 Intel Fortran安装 252
附录4 常用的GDB命令 256
附录5 Linux环境下Intel Fortran常用编译方案 259
附录6 Intel Fortran常用编译开关 261
附录7 C和C++语言中OpenMP常见用法 266
附录7.1 语法格式 266
附录7.2 头文件 266
附录7.3 指令类 266
附录7.4 子句类 268
附录7.5 库函数 269
附录7.6 最简单的C/C++并行程序 270
附录7.7 OpenMP并行程序的编译和执行 270
参考文献 271