[套装书]并行程序设计:概念与实践+并行程序设计导论(2册)

作者
贝蒂尔·施密特 豪尔赫·冈萨雷斯-多明格斯 克里斯蒂安·洪特 莫里茨·施拉布 Peter.S.Pacheco
丛书名
高性能计算技术丛书
出版社
机械工业出版社
ISBN
9782007071081
简要
简介
内容简介书籍计算机书籍 ---------------------------并行程序设计:概念与实践--------------------------- 本书由德国约翰内斯·古腾堡大学并行和分布式架构团队撰写,对并行编程的高级主题进行了深入讨论,除了涵盖基础概念外,还讲授了共享内存和分布式内存体系结构的实用编程技巧。作者提供了一套进行自动代码评估的开源系统,可方便地访问并行计算资源,这也使得本书特别适合于课堂教学。 ---------------------------并行程序设计导论(涵盖并行软件和硬件的方方面面,手把手教你如何利用MPI、PThread 和OpenMP开发高效的并行程序)--------------------------- 《并行程序设计导论》全面涵盖了并行软件和硬件的方方面面,深入浅出地介绍如何使用MPI(分布式内存编程)、Pthreads和OpenMP(共享内存编程)编写高效的并行程序。各章节包含了难易程度不同的编程习题。 《并行程序设计导论》可以用做计算机科学专业低年级本科生的专业课程的教材,也可以作为软件开发人员学习并行程序设计的专业参考书。
目录



---------------------------并行程序设计:概念与实践---------------------------


译者序
前言
致谢
第1章 绪论 1
1.1 一个有趣的例子及其分析 2
1.2 并行计算基础 10
1.2.1 分布式内存系统 10
1.2.2 共享内存系统 11
1.2.3 并行程序设计需考虑的因素 13
1.3 HPC动态和排名 15
1.4 附加练习 17
第2章 理论背景 19
2.1 PRAM 20
2.1.1 PRAM变体 21
2.1.2 PRAM上的并行前缀计算 22
2.1.3 PRAM上稀疏数组的压缩算法 24
2.2 网络拓扑 25
2.3 Amdahl定律和Gustafson定律 29
2.4 Foster的并行算法设计方法学 34
2.5 附加练习 37
参考文献 40
第3章 现代体系结构 41
3.1 存储层次 42
3.1.1 冯·诺依曼瓶颈 42
3.1.2 高速缓冲存储器 43
3.1.3 缓存算法 44
3.1.4 优化缓存访问 45
3.1.5 高速缓存一致性 48
3.1.6 虚假共享 50
3.1.7 并发多线程技术和预取技术 50
3.1.8 展望 51
3.2 并行性的层次 51
3.2.1 Flynn分类法 51
3.2.2 SIMD概念 53
3.2.3 通用微处理器上的向量化 54
3.2.4 结构体数组和数组结构体 57
3.2.5 展望 63
3.3 附加练习 63
参考文献 67
第4章 C++多线程编程 68
4.1 多线程编程简介 69
4.1.1 多线程编程和多进程编程的区别 69
4.1.2 派生和并入线程 69
4.1.3 我们的第一个多线程程序 71
4.2 处理返回值 73
4.2.1 传统方法 74
4.2.2 使用promise和future的现代方法 75
4.2.3 异步方式 80
4.3 基于静态分发的调度机制 82
4.3.1 串行程序 83
4.3.2 线程的区块分发 87
4.3.3 线程的循环分发 90
4.3.4 虚假共享 91
4.3.5 线程的块循环分发 93
4.4 处理负载不平衡 95
4.4.1 静态调度 99
4.4.2 动态块循环分发 101
4.5 用条件变量通知线程 104
4.5.1 为一个睡觉的学生建模 105
4.5.2 使用条件变量 107
4.5.3 使用future和promise单发同步 108
4.6 隐式可数集合上的并行化 110
4.6.1 隐式可数集合 111
4.6.2 线程池用例 112
4.6.3 一个简单线程池的实现 114
4.7 附加练习 119
参考文献 121
第5章 高级C++11多线程编程 122
5.1 无锁编程 122
5.1.1 原子计数 123
5.1.2 非基本原子数据类型 124
5.1.3 利用比较交换以原子方式并行化最大值归约 126
5.1.4 任意原子操作 129
5.1.5 ABA问题 132
5.2 工作共享线程池 133
5.2.1 工作共享线程池的用例 133
5.2.2 工作共享的实现 135
5.3 并行图搜索 137
5.3.1 二元背包问题 138
5.3.2 串行实现 139
5.3.3 并行实现 144
5.4 展望 146
5.5 附加练习 148
参考文献 149
第6章 OpenMP 150
6.1 OpenMP简介 151
6.1.1 OpenMP简史 151
6.1.2 基础 151
6.2 parallel for制导语句 153
6.2.1 向量加法 154
6.2.2 变量共享和私有化 157
6.2.3 矩阵向量乘法 160
6.3 基本的并行归约 162
6.3.1 最近邻分类 162
6.3.2 手写数字数据集MNIST 163
6.3.3 完全配对距离计算的理论视角 164
6.3.4 完全配对计算的实现 165
6.3.5 并行标签预测 168
6.3.6 性能评测 169
6.4 不平衡循环调度 171
6.4.1 对称性引起的负载失衡 172
6.4.2 内积计算实现 173
6.4.3 性能评测 174
6.5 高级归约 175
6.5.1 MNIST数据集上的SOFTMAX回归分类器 175
6.5.2 定制归约操作符 183
6.5.3 OpenMP高级归约 187
6.6 任务并行 189
6.6.1 树遍历 190
6.6.2 循环中生成任务 193
6.7 SIMD向量化 193
6.7.1 数据依赖 195
6.7.2 向量化感知函数 196
6.8 展望 196
6.9 附加练习 197
参考文献 202
第7章 统一计算设备架构 203
7.1 CUDA简介 204
7.2 支持CUDA的GPU硬件架构 206
7.2.1 主机与设备之间的互连 206
7.2.2 显存和峰值宽度 207
7.2.3 计算资源的组织 207
7.3 内存访问模式 211
7.3.1 均值名人脸的计算 212
7.3.2 计算中心化的数据矩阵 218
7.3.3 计算协方差矩阵 221
7.3.4 计算特征脸 229
7.4 内存层次结构 232
7.4.1 问题简介 233
7.4.2 串行DTW的线性内存算法 237
7.4.3 线性内存DTW的一个初始CUDA移植 243
7.4.4 共享内存中的波前松弛 248
7.4.5 并发调度和bank冲突 253
7.4.6 纹理内存和常量内存 254
7.5 优化准则 257
7.6 附加练习 258
参考文献 259
第8章 高级CUDA编程 261
8.1 warp内联函数和原子操作 261
8.1.1 分段并行归约 262
8.1.2 全局并行归约 265
8.1.3 任意原子操作 267
8.1.4 展望 269
8.2 利用多块GPU和流 269
8.2.1 牛顿迭代 269
8.2.2 利用多块GPU 272
8.2.3 通信和计算交叉 274
8.2.4 多块GPU上的流式计算 278
8.3 展望 280
8.3.1 统一内存 280
8.3.2 动态并行性 281
8.3.3 协作组 281
8.3.4 张量核心 281
8.3.5 GPU集群上的分布式计算 282
8.4 附加练习 282
参考文献 284
第9章 MPI 286
9.1 MPI简介 286
9.2 基本概念 288
9.3 点到点通信 289
9.4 非阻塞通信 292
9.5 集合通信 295
9.6 计算通信重叠 300
9.7 派生数据类型 309
9.8 复杂通信域 315
9.9 展望 322
9.10 附加练习 322
参考文献 327
第10章 统一并行C++ 329
10.1 PGAS和UPC++简介 329
10.2 基本概念 331
10.3 内存亲和性和私有化 332
10.4 全局指针和集合函数 337
10.5 锁 343
10.6 远程函数调用 348
10.7 附加练习 355
参考文献 357



---------------------------并行程序设计导论(涵盖并行软件和硬件的方方面面,手把手教你如何利用MPI、PThread 和OpenMP开发高效的并行程序)---------------------------


《并行程序设计导论》
出版者的话
译者序
本书赞誉
前言
致谢
第1章为什么要并行计算
1.1为什么需要不断提升的性能
1.2为什么需要构建并行系统
1.3为什么需要编写并行程序
1.4怎样编写并行程序
1.5我们将做什么
1.6并发、并行、分布式
1.7本书的其余部分
1.8警告
1.9字体约定
1.10小结
1.11习题
第2章并行硬件和并行软件
2.1背景知识
2.1.1冯·诺依曼结构
2.1.2进程、多任务及线程
2.2对冯·诺依曼模型的改进
2.2.1Cache基础知识
2.2.2Cache映射
2.2.3Cache和程序: 一个实例
2.2.4虚拟存储器
2.2.5指令级并行
2.2.6硬件多线程
2.3并行硬件
2.3.1SIMD系统
2.3.2MIMD系统
2.3.3互连网络
2.3.4Cache一致性
2.3.5共享内存与分布式内存
2.4并行软件
2.4.1注意事项
2.4.2进程或线程的协调
2.4.3共享内存
2.4.4分布式内存
2.4.5混合系统编程
2.5输入和输出
2.6性能
2.6.1加速比和效率
2.6.2阿姆达尔定律
2.6.3可扩展性
2.6.4计时
2.7并行程序设计
2.8编写和运行并行程序
2.9假设
2.10小结
2.10.1串行系统
2.10.2并行硬件
2.10.3并行软件
2.10.4输入和输出
2.10.5性能
2.10.6并行程序设计
2.10.7假设
2.11习题
第3章用MPI进行分布式内存编程
3.1预备知识
3.1.1编译与执行
3.1.2MPI程序
3.1.3MPI_Init和MPI_Finalize
3.1.4通信子、MPI_Comm_size和MPI_Comm_rank
3.1.5SPMD程序
3.1.6通信
3.1.7MPI_Send
3.1.8MPI_Recv
3.1.9消息匹配
3.1.10status_p参数
3.1.11MPI_Send和MPI_Recv的语义
3.1.12潜在的陷阱
3.2用MPI来实现梯形积分法
3.2.1梯形积分法
3.2.2并行化梯形积分法
3.3I/O处理
3.3.1输出
3.3.2输入
3.4集合通信
3.4.1树形结构通信
3.4.2MPI_Reduce
3.4.3集合通信与点对点通信
3.4.4MPI_Allreduce
3.4.5广播
3.4.6数据分发
3.4.7散射
3.4.8聚集
3.4.9全局聚集
3.5MPI的派生数据类型
3.6MPI程序的性能评估
3.6.1计时
3.6.2结果
3.6.3加速比和效率
3.6.4可扩展性
3.7并行排序算法
3.7.1简单的串行排序算法
3.7.2并行奇偶交换排序
3.7.3MPI程序的安全性
3.7.4并行奇偶交换排序算法的重要内容
3.8小结
3.9习题
3.10编程作业
第4章用Pthreads进行共享内存编程
4.1进程、线程和Pthreads
4.2“Hello,World”程序
4.2.1执行
4.2.2准备工作
4.2.3启动线程
4.2.4运行线程
4.2.5停止线程
4.2.6错误检查
4.2.7启动线程的其他方法
4.3矩阵-向量乘法
4.4临界区
4.5忙等待
4.6互斥量
4.7生产者-消费者同步和信号量
4.8路障和条件变量
4.8.1忙等待和互斥量
4.8.2信号量
4.8.3条件变量
4.8.4Pthreads路障
4.9读写锁
4.9.1链表函数
4.9.2多线程链表
4.9.3Pthreads读写锁
4.9.4不同实现方案的性能
4.9.5实现读写锁
4.10缓存、缓存一致性和伪共享
4.11线程安全性
4.12小结
4.13习题
4.14编程作业
第5章用OpenMP进行共享内存编程
5.1预备知识
5.1.1编译和运行OpenMP程序
5.1.2程序
5.1.3错误检查
5.2梯形积分法
5.3变量的作用域
5.4归约子句
5.5parallel for指令
5.5.1警告
5.5.2数据依赖性
5.5.3寻找循环依赖
5.5.4π值估计
5.5.5关于作用域的更多问题
5.6更多关于OpenMP的循环:排序
5.6.1冒泡排序
5.6.2奇偶变换排序
5.7循环调度
5.7.1schedule子句
5.7.2static调度类型
5.7.3dynamic和guided调度类型
5.7.4runtime调度类型
5.7.5调度选择
5.8生产者和消费者问题
5.8.1队列
5.8.2消息传递
5.8.3发送消息
5.8.4接收消息
5.8.5终止检测
5.8.6启动
5.8.7atomic指令
5.8.8临界区和锁
5.8.9在消息传递程序中使用锁
5.8.10critical指令、atomic指令、锁的比较
5.8.11经验
5.9缓存、缓存一致性、伪共享
5.10线程安全性
5.11小结
5.12习题
5.13编程作业
第6章并行程序开发
6.1n体问题的两种解决方法
6.1.1问题
6.1.2两个串行程序
6.1.3并行化n体算法
6.1.4关于I/O
6.1.5用OpenMP并行化基本算法
6.1.6用OpenMP并行化简化算法
6.1.7评估OpenMP程序
6.1.8用Pthreads并行化算法
6.1.9用MPI并行化基本算法
6.1.10用MPI并行化简化算法
6.1.11MPI程序的性能
6.2树形搜索
6.2.1递归的深度优先搜索
6.2.2非递归的深度优先搜索
6.2.3串行实现所用的数据结构
6.2.4串行实现的性能
6.2.5树形搜索的并行化
6.2.6采用Pthreads实现的静态并行化树搜索
6.2.7采用Pthreads实现的动态并行化树搜索
6.2.8Pthreads树搜索程序的评估
6.2.9采用OpenMp实现的并行化树搜索程序
6.2.10OpenMp实现的性能
6.2.11采用MPI和静态划分来实现树搜索
6.2.12采用MPI和动态划分来实现树搜索
6.3忠告
6.4选择哪个API
6.5小结
6.5.1Pthreads和OpenMP
6.5.2MPI
6.6习题
6.7编程作业
第7章接下来的学习方向
参考文献
索引



有问题微信扫码联系

推荐

Understand China
桂ICP备20004708号-4