1 并行计算概论 1
1.1 并行计算机的种类 2
1.1.1 多核CPU 2
1.1.2 GPU 2
1.1.3 CPU与存储器的连接方式 3
1.1.4 数据的通信方式 4
1.1.5 常见的并行计算硬件系统 5
1.1.6 指令和数据之间的工作方式 5
1.2 并行计算 5
1.2.1 并行计算、高性能计算与超级计算 5
1.2.2 并行处理技术 6
1.3 高性能并行计算特征 7
1.4 并行编程模式 7
1.4.1 共享内存模式 8
1.4.2 消息传递模式 8
1.4.3 数据并行模式 9
1.4.4 异构计算 10
1.5 OpenMP和MPI的特点 13
1.6 并行计算中常用概念 14
1.6.1 并发、并行和并行计算 14
1.6.2 程序、线程、进程和超线程 15
1.6.3 单核编程和多核编程 16
1.6.4 线程绑定 17
1.6.5 多线程编程和多进程编程 17
1.6.6 并行算法评价 18
1.7 OpenMP多核编程 20
1.7.1 OpenMP历史 20
1.7.2 OpenMP特点 21
1.8 Linux系统 22
1.9 常用编译器与OpenMP 22
1.9.1 Windows环境下Visual Studio 2008命令行界面的编译和执行 23
1.9.2 Windows环境下Visual Studio 2008菜单界面的编译和执行 24
1.9.3 Windows环境下MinGW-W64的安装 25
1.9.4 Linux环境下Intel C/C+++编译器icc的安装 26
1.9.5 在Windows系统下远程操作服务器端Linux环境下的编译器 26
1.9.6 Windows和Linux环境下常用命令和系统资源检查 27
1.10 小结 27
练习题 28
2 OpenMP编程简介 30
2.1 编译指导语句 30
2.2 并行执行模式 31
2.2.1 编译指导语句格式 31
2.2.2 主要指令 32
2.2.3 主要子句 33
2.2.4 指令的作用域 34
2.2.5 指令和子句的配套使用 35
2.3 头文件 36
2.4 常用库函数 37
2.5 最简单的并行程序 37
2.6 小结 42
练习题 42
3 数据环境 43
3.1 子句private、子句shared和子句default 43
3.2 子句firstprivate和子句lastprivate 49
3.3 指令threadprivate 52
3.4 子句copyin和子句copyprivate 58
3.5 子句reduction 62
3.6 数据竞争 67
3.7 伪共享 69
3.8 小结 71
练习题 72
4 并行控制 73
4.1 指令parallel 73
4.2 设定线程数量 76
4.3 默认模式 77
4.4 静态模式 77
4.5 动态模式 78
4.6 嵌套模式与num_threads子句 80
4.7 条件并行子句if 84
4.8 动态设置并行循环的线程数量 86
4.9 小结 86
练习题 86
5 并行构造 87
5.1 负载平衡 88
5.1.1 静态负载平衡 89
5.1.2 动态负载平衡 89
5.2 依赖关系 90
5.2.1 循环依赖 90
5.2.2 内存依赖 95
5.2.3 任务依赖 96
5.3 指令for 98
5.3.1 单重循环 100
5.3.2 嵌套循环 102
5.3.3 循环工作量的划分与调度 104
5.3.4 子句collapse 112
5.4 指令sections 115
5.5 指令single 117
5.6 合并的并行工作共享结构 119
5.7 小结 119
练习题 119
6 线程同步 120
6.1 互斥锁机制 121
6.2 事件同步机制 121
6.3 指令barrier 121
6.4 指令nowait 124
6.5 指令master 125
6.6 指令critieal 128
6.7 指令atomic 129
6.8 指令ordered 132
6.9 指令flush 135
6.10 小结 139
练习题 139
7 运行环境 140
7.1 环境变量 140
7.1.1 OMP_DYNAMIC 141
7.1.2 OMP_SCHEDULE 141
7.1.3 OMP_NUM_THREADS 141
7.1.4 OMP_NESTED 141
7.1.5 OMP_STACKSIZE 142
7.1.6 OMP_WAIT_POLICY 142
7.1.7 OMP_PROC_BIND 142
7.1.8 环境变量的设置方法 142
7.1.9 段错误和环境变量的应用 143
7.2 库函数 144
7.2.1 运行环境操作函数 144
7.2.2 OpenMP时间函数 146
7.2.3 热点分析 148
7.2.4 锁函数 151
7.3 小结 156
练习题 156
8 任务 157
8.1 任务简介 157
8.1.1 任务结构 158
8.1.2 任务类别 159
8.2 任务的创建 163
8.2.1 指令parallel和子句single 164
8.2.2 指令for 166
8.2.3 指令sections 168
8.2.4 包含任务 169
8.2.5 递归 171
8.3 任务调度原则 174
8.3.1 栅障barrier 176
8.3.2 指令taskwait 176
8.3.3 指令taskgroup 177
8.3.4 指令taskyield 179
8.3.5 子句if 180
8.4 任务的执行和完成 181
8.5 任务的数据环境 181
8.5.1 共享变量和私有变量 182
8.5.2 任务与对栈数据的引用 184
8.5.3 全局变量 187
8.6 任务依赖子句depend 188
8.7 指令taskloop 191
8.8 小规模任务 193
8.8.1 子句final 193
8.8.2 子句mergeable 194
8.9 子句priority 195
8.10 小结 195
练习题 195
9 向量化SIMD 196
9.1 SIMD的发展 196
9.2 代码风格 198
9.3 循环的串行向量化指令simd 199
9.3.1 子句aligned 204
9.3.2 子句safelen 204
9.3.3 子句simdlen 205
9.3.4 子句linear 205
9.4 循环的并行向量化指令for simd 207
9.5 函数的向量化指令declare simd 207
9.5.1 子句inbranch和notinbranch 208
9.5.2 子句uniform 210
9.6 小结 212
练习题 212
10 异构计算 213
10.1 目标设备查询 213
10.2 控制权的移交指令target 215
10.2.1 子句device 216
10.2.2 子句map 216
10.2.3 子句defaultmap 218
10.2.4 子句if 220
10.2.5 指令target data 221
10.2.6 指令target enter data和target exit data 224
10.2.7 指令target update 225
10.2.8 指令declare target 227
10.3 线程组群指令teams 228
10.4 工作共享指令distribute 230
10.5 异步执行和依赖性 232
10.6 OpenMP并行执行模式比较 234
10.7 小结 237
练习题 237
参考文献 238