目 录?Contents
译者序
前 言
第1章 概述 1
1.1 多核计算机时代 1
1.2 并行计算机的分类 3
1.3 现代计算机概览 4
1.3.1 Cell BE处理器 5
1.3.2 NVIDIA Kepler 6
1.3.3 AMD APU 9
1.3.4 从多核到众核:Tilera TILE-Gx8072和Intel Xeon Phi 10
1.4 性能指标 12
1.5 并行程序性能的预测与测量 16
1.5.1 Amdahl定律 18
1.5.2 Gustafson-Barsis定律 20
第2章 多核和并行程序设计 23
2.1 引言 23
2.2 PCAM方法学 24
2.3 分解模式 26
2.3.1 任务并行 27
2.3.2 分而治之分解 28
2.3.3 几何分解 30
2.3.4 递归数据分解 32
2.3.5 流水线分解 35
2.3.6 基于事件的合作分解 39
2.4 程序结构模式 39
2.4.1 单程序多数据 40
2.4.2 多程序多数据 40
2.4.3 主/从 41
2.4.4 map-reduce 41
2.4.5 fork/join 42
2.4.6 循环并行 44
2.5 匹配分解模式和程序结构模式 44
第3章 共享内存编程:线程 46
3.1 引言 46
3.2 线程 48
3.2.1 线程的定义 48
3.2.2 线程的作用 49
3.2.3 线程的生成和初始化 49
3.2.4 在线程间共享数据 55
3.3 设计考虑 57
3.4 信号量 58
3.5 经典问题中的信号量 62
3.5.1 生产者–消费者 63
3.5.2 终止处理 66
3.5.3 理发师问题:引入公平性 75
3.5.4 读者–写者问题 80
3.6 monitor 84
3.6.1 设计方法1:monitor内部的关键区 87
3.6.2 设计方法2:monitor控制关键区的入口 87
3.7 经典问题中的monitor 91
3.7.1 重新考虑生产者–消费者问题 91
3.7.2 重新考虑读者–写者问题 95
3.8 动态线程管理与静态线程管理 102
3.8.1 Qt线程池 102
3.8.2 线程池的创建和管理 103
3.9 调试多线程应用 111
3.10 高层次结构:无须显式利用线程的多线程编程 115
3.10.1 并发map 116
3.10.2 map-reduce 118
3.10.3 并发过滤 120
3.10.4 filter-reduce 121
3.10.5 案例研究:多线程存储 122
3.10.6 案例研究:多线程图像匹配 131
第4章 共享内存编程:OpenMP 140
4.1 引言 140
4.2 第一个OpenMP程序 141
4.3 变量作用域 144
4.3.1 定积分OpenMP版本V.0:人工划分 146
4.3.2 定积分OpenMP版本 V.1:无竞争条件的人工划分 147
4.3.3 定积分OpenMP V.2:基于锁的隐式划分 148
4.3.4 定积分OpenMP V.3:基于归约的隐式划分 150
4.3.5 变量作用域总结 151
4.4 循环级并行 152
4.4.1 数据依赖 154
4.4.2 嵌套循环 162
4.4.3 调度 162
4.5 任务并行 166
4.5.1 sections指令 166
4.5.2 task指令 171
4.6 同步结构 177
4.7 正确性与优化问题 183
4.7.1 线程安全 183
4.7.2 假共享 187
4.8 案例研究:OpenMP中的排序算法 192
4.8.1 自下而上归并排序算法的OpenMP实现 192
4.8.2 自上而下归并排序算法的OpenMP实现 195
4.8.3 性能评估 200
第5章 分布式内存编程 203
5.1 通信进程 203
5.2 MPI 204
5.3 核心概念 205
5.4 你的第一个MPI程序 206
5.5 程序体系结构 208
5.5.1 SPMD 208
5.5.2 MPMD 209
5.6 点对点通信 210
5.7 可选的点对点通信模式 214
5.8 非阻塞通信 216
5.9 点对点通信小结 220
5.10 错误报告与处理 220
5.11 集合通信简介 222
5.11.1 分发 226
5.11.2 收集 231
5.11.3 归约 233
5.11.4 多对多收集 237
5.11.5 多对多分发 240
5.11.6 多对多归约 245
5.11.7 全局同步 245
5.12 通信对象 245
5.12.1 派生数据类型 246
5.12.2 打包/解包 253
5.13 节点管理:通信器和组 254
5.13.1 创建组 255
5.13.2 建立内部通信器 257
5.14 单边通信 259
5.14.1 RMA通信函数 261
5.14.2 RMA同步函数 262
5.15 I/O注意事项 270
5.16 MPI多进程和多线程混合编程 276
5.17 时序和性能测量 279
5.18 调试和分析MPI程序 279
5.19 Boost.MPI库 283
5.19.1 阻塞和非阻塞通信 285
5.19.2?数据序列化 289
5.19.3?集合通信 292
5.20 案例研究:有限扩散聚合模型 295
5.21 案例研究:暴力加密破解 300
5.21.1 版本1:“基本型”MPI 300
5.21.2 版本2:MPI与OpenMP的结合 305
5.22 案例研究:主/从式并行模型的MPI实现 308
5.22.1 简单主/从式设置 309
5.22.2 多线程主/从式设置 316
第6章 GPU编程 333
6.1 GPU编程简介 333
6.2 CUDA编程模型:线程、线程块、线程网格 335
6.3 CUDA执行模型:流多处理器和warp 340
6.4 CUDA程序编译过程 344
6.5 构建CUDA项目 347
6.6 内存层次结构 349
6.6.1 本地内存/寄存器 355
6.6.2 共享内存 356
6.6.3 常量内存 363
6.6.4 texture和surface内存 368
6.7 优化技术 369
6.7.1 线程组织设计 369
6.7.2 kernel结构 378
6.7.3 共享内存访问 382
6.7.4 全局内存访问 388
6.7.5 page-locked与zero-copy内存 392
6.7.6 统一内存 394