目 录
[第1章 概述
1.1 多核计算机时代 ](https://yq.aliyun.com/articles/90097)
1.2 并行计算机的分类
[1.3 现代计算机概览
1.3.1 Cell BE处理器
1.3.2 NVIDIA Kepler
1.3.3 AMD APU
1.3.4 从多核到众核:Tilera TILE-Gx8072和Intel Xeon Phi ](https://yq.aliyun.com/articles/90111)
1.4 性能指标
[1.5 并行程序性能的预测与测量
1.5.1 Amdahl定律
1.5.2 Gustafson-Barsis定律 ](https://yq.aliyun.com/articles/90128)
[第2章 多核和并行程序设计
2.1 引言 ](https://yq.aliyun.com/articles/90130)
2.2 PCAM方法学
[2.3 分解模式
2.3.1 任务并行
2.3.2 分而治之分解
2.3.3 几何分解
2.3.4 递归数据分解
2.3.5 流水线分解
2.3.6 基于事件的合作分解 ](https://yq.aliyun.com/articles/90179)
[2.4 程序结构模式
2.4.1 单程序多数据
2.4.2 多程序多数据
2.4.3 主/从
2.4.4 map-reduce
2.4.5 fork/join
2.4.6 循环并行 ](https://yq.aliyun.com/articles/90196)
2.5 匹配分解模式和程序结构模式
[第3章 共享内存编程:线程
3.1 引言 ](https://yq.aliyun.com/articles/90207)
[3.2 线程
3.2.1 线程的定义
3.2.2 线程的作用
3.2.3 线程的生成和初始化
3.2.4 在线程间共享数据 ](https://yq.aliyun.com/articles/90226)
3.3 设计考虑
3.4 信号量
[3.5 经典问题中的信号量
3.5.1 生产者–消费者
3.5.2 终止处理
3.5.3 理发师问题:引入公平性
3.5.4 读者–写者问题 ](https://yq.aliyun.com/articles/90270/)
[3.6 monitor
3.6.1 设计方法1:monitor内部的关键区
3.6.2 设计方法2:monitor控制关键区的入口 ](https://yq.aliyun.com/articles/90286)
[3.7 经典问题中的monitor
3.7.1 重新考虑生产者–消费者问题
3.7.2 重新考虑读者–写者问题 ](https://yq.aliyun.com/articles/90309)
[3.8 动态线程管理与静态线程管理
3.8.1 Qt线程池
3.8.2 线程池的创建和管理 ](https://yq.aliyun.com/articles/90346/)
3.9 调试多线程应用
3.10 高层次结构:无须显式利用线程的多线程编程
3.10.1 并发map
3.10.2 map-reduce
3.10.3 并发过滤
3.10.4 filter-reduce
3.10.5 案例研究:多线程存储
3.10.6 案例研究:多线程图像匹配
第4章 共享内存编程:OpenMP
4.1 引言
4.2 第一个OpenMP程序
4.3 变量作用域
4.3.1 定积分OpenMP版本V.0:人工划分
4.3.2 定积分OpenMP版本 V.1:无竞争条件的人工划分
4.3.3 定积分OpenMP V.2:基于锁的隐式划分
4.3.4 定积分OpenMP V.3:基于归约的隐式划分
4.3.5 变量作用域总结
4.4 循环级并行
4.4.1 数据依赖
4.4.2 嵌套循环
4.4.3 调度
4.5 任务并行
4.5.1 sections指令
4.5.2 task指令
4.6 同步结构
4.7 正确性与优化问题
4.7.1 线程安全
4.7.2 假共享
4.8 案例研究:OpenMP中的排序算法
4.8.1 自下而上归并排序算法的OpenMP实现
4.8.2 自上而下归并排序算法的OpenMP实现
4.8.3 性能评估
第5章 分布式内存编程
5.1 通信进程
5.2 MPI
5.3 核心概念
5.4 你的第一个MPI程序
5.5 程序体系结构
5.5.1 SPMD
5.5.2 MPMD
5.6 点对点通信
5.7 可选的点对点通信模式
5.8 非阻塞通信
5.9 点对点通信小结
5.10 错误报告与处理
5.11 集合通信简介
5.11.1 分发
5.11.2 收集
5.11.3 归约
5.11.4 多对多收集
5.11.5 多对多分发
5.11.6 多对多归约
5.11.7 全局同步
5.12 通信对象
5.12.1 派生数据类型
5.12.2 打包/解包
5.13 节点管理:通信器和组
5.13.1 创建组
5.13.2 建立内部通信器
5.14 单边通信
5.14.1 RMA通信函数
5.14.2 RMA同步函数
5.15 I/O注意事项
5.16 MPI多进程和多线程混合编程
5.17 时序和性能测量
5.18 调试和分析MPI程序
5.19 Boost.MPI库
5.19.1 阻塞和非阻塞通信
5.19.2?数据序列化
5.19.3?集合通信
5.20 案例研究:有限扩散聚合模型
5.21 案例研究:暴力加密破解
5.21.1 版本1:“基本型”MPI
5.21.2 版本2:MPI与OpenMP的结合
5.22 案例研究:主/从式并行模型的MPI实现
5.22.1 简单主/从式设置
5.22.2 多线程主/从式设置
第6章 GPU编程
6.1 GPU编程简介
6.2 CUDA编程模型:线程、线程块、线程网格
6.3 CUDA执行模型:流多处理器和warp
6.4 CUDA程序编译过程
6.5 构建CUDA项目
6.6 内存层次结构
6.6.1 本地内存/寄存器
6.6.2 共享内存
6.6.3 常量内存
6.6.4 texture和surface内存
6.7 优化技术
6.7.1 线程组织设计
6.7.2 kernel结构
6.7.3 共享内存访问
6.7.4 全局内存访问
6.7.5 page-locked与zero-copy内存
6.7.6 统一内存
6.7.7 异步执行和流
6.8 动态并行
6.9 CUDA程序的调试
6.10 CUDA程序剖析
6.11 CUDA和MPI
6.12 案例研究
6.12.1 分形集合计算
6.12.2 块加密算法
第7章 Thrust模板库
7.1 引言
7.2 使用Thrust的第一步
7.3 Thrust数据类型
7.4 Thrust算法
7.4.1 变换算法
7.4.2 排序与查询
7.4.3 归约
7.4.4 scan /前缀和
7.4.5 数据管理与处理
7.5 花式迭代器
7.6 交换设备后端
7.7 案例研究
7.7.1 蒙特卡洛积分
7.7.2 DNA序列比对
第8章 负载均衡
8.1 引言
8.2 动态负载均衡:Linda的遗赠
8.3 静态负载均衡:可分负载理论方法
8.3.1 建模开销
8.3.2 通信设置
8.3.3 分析
8.3.4 总结?:简短的文献综述
8.4 DLTlib:分割工作负载的库
8.5 案例研究
8.5.1 Mandelbrot集“电影”的混合计算:动态负载均衡案例研究
8.5.2 分布式块加密:静态负载均衡案例研究
在线资源
附录A 编译Qt程序
附录B 运行MPI程序:准备与配置步骤
附录C 测量时间
附录D Boost.MPI
附录E CUDA环境搭建
附录F DLTlib
术语表
参考文献