大规模并行处理器程序设计 原书第4版-胡文美 pdf下载
选择版本
内容简介
本篇主要提供大规模并行处理器程序设计 原书第4版-胡文美电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com
本书内容简洁、直观、实用,强调计算思维能力和并行编程技巧。本书主要分为四个部分:第 一部分介绍异构并行计算编程的基础概念,包括数据并行化、GPU架构、CUDA编程及程序性能优化方法等内容;第二部分介绍并行模式,包括卷积、模板、并行直方图、归约、前缀和、归并等内容;第三部分介绍高级模式及应用,包括排序、稀疏矩阵计算、图遍历、深度学习、迭代式磁共振成像重建、静电势能图和计算思维等内容;第四部分介绍高级编程实践,包括异构计算集群编程、CUDA动态并行化等内容。本书不仅适合高等院校计算机相关专业的学生学习,也适合并行计算领域的技术人员参考。
目 录
Programming Massively Parallel Processors: A Hands-on Approach, Fourth Edition
译者序
推荐序
前言
致谢
第1章 引言 1
1.1 异构并行计算 2
1.2 为什么需要速度与并行性 5
1.3 加快实际应用的速度 6
1.4 并行编程中的挑战 7
1.5 相关的并行编程接口 8
1.6 本书的总体目标 9
1.7 本书的章节安排 10
参考文献 12
第一部分 基本概念
第2章 异构数据并行计算 14
2.1 数据并行性 14
2.2 CUDA C程序结构 16
2.3 向量加法核 17
2.4 设备全局存储和数据传输 19
2.5 核函数和线程 22
2.6 调用核函数 25
2.7 编译 27
2.8 总结 27
2.8.1 函数声明 27
2.8.2 内核调用和网格启动 27
2.8.3 内置(预定义)变量 28
2.8.4 运行时应用程序编程接口 28
练习 28
参考文献 30
第3章 多维网格和数据 31
3.1 多维网格组织 31
3.2 将线程映射到多维数据 33
3.3 图像模糊:更复杂的内核 38
3.4 矩阵乘法 41
3.5 总结 44
练习 44
第4章 计算架构和调度 46
4.1 现代GPU架构 46
4.2 块调度 47
4.3 同步和透明可扩展性 47
4.4 线程束和SIMD硬件 49
4.5 控制发散 53
4.6 线程束调度和延迟容忍 55
4.7 资源划分和占用率 56
4.8 查询设备属性 58
4.9 总结 60
练习 60
参考文献 61
第5章 内存架构和数据局部性 62
5.1 内存访问效率的重要性 62
5.2 CUDA内存类型 64
5.3 利用平铺减少内存流量 68
5.4 平铺的矩阵乘法内核 70
5.5 边界检查 74
5.6 内存使用对占用率的影响 76
5.7 总结 78
练习 78
第6章 性能方面的考虑 81
6.1 内存合并 81
6.2 隐藏内存延迟 87
6.3 线程粗化 91
6.4 优化清单 93
6.5 了解计算瓶颈 96
6.6 总结 96
练习 96
参考文献 97
第二部分 并行模式
第7章 卷积:常量内存和缓存 100
7.1 背景 100
7.2 并行卷积:一种基本算法 103
7.3 常量内存和缓存:概念与实例 105
7.4 边缘单元平铺卷积 108
7.5 使用边缘单元缓存的平铺卷积 111
7.6 总结 113
练习 113
第8章 模板 115
8.1 背景 115
8.2 并行模板:基本算法 118
8.3 用于模板扫描的共享内存平铺 119
8.4 线程粗化 121
8.5 寄存器平铺 123
8.6 总结 125
练习 125
第9章 并行直方图:原子操作和
私有化 126
9.1 背景 126
9.2 原子操作与基本直方图内核 128
9.3 原子操作的延迟和吞吐量 131
9.4 私有化 132
9.5 粗化 134
9.6 聚合 137
9.7 总结 138
练习 138
参考文献 139
第10章 归约和最小化发散 140
10.1 背景 140
10.2 归约树 141
10.3 一个简单的归约内核 143
10.4 最小化控制发散 145
10.5 最小化内存发散 148
10.6 最小化全局内存访问 149
10.7 对任意输入长度进行分层归约 150
10.8 利用线程粗化减少开销 152
10.9 总结 154
练习 154
第11章 前缀和(扫描):并行算法的工作效率 156
11.1 背景 156
11.2 基于Kogge-Stone算法的并行
扫描 158
11.3 关于速度与工作效率的考虑 162
11.4 基于Brent-Kung算法的并行
扫描 163
11.5 利用粗化提高工作效率 167
11.6 任意长度输入的分段并行扫描 168
11.7 利用单次扫描提高内存访问
效率 171
11.8 总结 172
练习 173
参考文献 173
第12章 归并:动态输入数据
识别 175
12.1 背景 175
12.2 串行归并算法 176
12.3 并行化方法 177
12.4 共秩函数的实现 178
12.5 基本并行归并内核 182
12.6 用于改进内存合并的平铺归并
内核 183
12.7 循环缓冲区归并内核 187
12.8 用于归并的线程粗化 192
12.9 总结 192
练习 193
参考文献 193
第三部分 高级模式及应用
第13章 排序 196
13.1 背景 196
13.2 基数排序 197
13.3 并行基数排序 198
13.4 内存合并优化 200
13.5 基值的选择 202
13.6 利用线程粗化改善合并 204
13.7 并行归并排序 205
13.8 其他并行排序方法 205
13.9 总结 206
练习 207
参考文献 207
第14章 稀疏矩阵计算 208
14.1 背景 208
14.2 具有COO格式的简单SpMV
内核 209
14.3 利用CSR格式分组非零行 211
14.4 利用ELL格式改善内存合并 213
14.5 利用混合ELL-COO格式调节
填充 216
14.6 利用JDS格式减少控制发散 217
14.7 总结 219
练习 219
参考文献 220
第15章 图遍历 221
15.1 背景 221
15.2 广度优先搜索 223
15.3 以顶点为中心的广度优先搜索
并行化 225
15.4 以边为中心的广度优先搜索
并行化 228
15.5 利用边界提高效率 230
15.6 利用私有化减少争用 232
15.7 其他优化 233
15.7.1 减少启动开销 233
15.7.2 优化负载均衡 234
15.7.3 进一步的挑战 234
15.8 总结 235
练习 235
参考文献 236
第16章 深度学习 237
16.1 背景 237
16.1.1 多层分类器 239
16.1.2 训练模型 241
16.2 卷积神经网络 244
16.2.1 卷积神经网络推理 245
16.2.2 卷积神经网络反向传播 248
16.3 卷积层:CUDA推理内核 252
16.4 卷积层的GEMM表示 254
16.5 CUDNN库 258
16.6 总结 259
练习 260
参考文献 260
第17章 迭代式磁共振成像重建 261
17.1 背景 261
17.2 迭代式重建 263
17.3 计算FHD 264
17.3.1 第1步:确定核函数的
并行结构 265
17.3.2 第2步:克服内存带宽
限制 269
17.3.3 第3步:使用硬件三角
函数 273
17.3.4 第4步:实验性能调优 275
17.4 总结 275
练习 275
参考文献 276
第18章 静电势能图 277
18.1 背景 277
18.2 核函数设计:分散法与聚集法 278
18.3 线程粗化 281
18.4 内存合并 283
18.5 用于数据尺寸可扩展性的截断
分箱 284
18.6 总结 288
练习 288
参考文献 288
第19章 并行编程与计算思维 289
19.1 并行计算的目标 289
19.2 算法选择 291
19.3 问题分解 293
19.4 计算思维 295
19.5 总结 296
参考文献 296
第四部分 高级实践
第20章 异构计算集群编程:
CUDA流 298
20.1 背景 298
20.2 一个运行示例 298
20.3 MPI基础 300
20.4 点对点通信的MPI 302
20.5 计算与通信的重叠 307
20.6 MPI集体通信接口 313
20.7 CUDA感知的MPI 313
20.8 总结 313
练习 314
参考文献 314
第21章 CUDA动态并行性 315
21.1 背景 315
21.2 动态并行性概述 316
21.3 示例:贝塞尔曲线 318
21.3.1 线性贝塞尔曲线 319
21.3.2 二次贝塞尔曲线 319
21.3.3 贝塞尔曲线计算(不使用
动态并行性) 319
21.3.4 贝塞尔曲线计算(使用动态
并行性) 320
21.4 递归示例:四叉树 321
21.5 重要注意事项 326
21.5.1 内存和数据可见性 326
21.5.2 待处理启动池配置 327
21.5.3 流 327
21.5.4 嵌套深度 328
21.6 总结 328
练习 328
参考文献 329
附录 四叉树示例的支持代码 329
第22章 高级实践与未来演变 332
22.1 主机/设备交互模型 332
22.1.1 零拷贝内存及统一虚拟
地址空间 333
22.1.2 大型虚拟和物理地址空间 334
22.1.3 统一内存 334
22.1.4 虚拟地址空间控制 336
22.2 内核执行控制 336
22.2.1 核函数中的函数调用 336
22.2.2 核函数中的异常处理 337
22.2.3 多个网格的同时执行 337
22.2.4 硬件队列和动态并行性 337
22.2.5 可中断的网格 337
22.2.6 合作内核 338
22.3 内存带宽和计算吞吐量 338
22.3.1 双精度速度 338
22.3.2 更好的控制流效率 338
22.3.3 可配置缓存和暂存内存 338
22.3.4 增强的原子操作 339
22.3.5 增强的全局内存访问 339
22.4 编程环境 339
22.4.1 统一设备内存空间 339
22.4.2 使用关键路径分析进行性能
分析 340
22.5 展望未来 341
参考文献 341
第23章 结论与展望 342
23.1 目标回顾 342
23.2 未来展望 343
附录 数值方面的考虑 345