具体描述
作者简介
David B. Kirk院士:美国国家工程院院士,NVIDIA院士、前首席科学家,也是CUDA技术的创始人之一,2002年曾荣获ACM SIGGRAPH计算机图形成就奖。他拥有麻省理工学院的机械工程学学士和硕士学位,加州理工学院的计算机科学博士学位。Kirk是50项与图形芯片设计相关的专利和专利申请的发明者,发表了50多篇关于图形处理技术的论文,是可视化计算技术方面的权威。
Wen-mei W. Hwu(胡文美)教授:拥有美国加州大学伯克利分校计算机科学博士学位,担任美国伊利诺伊大学厄巴纳-香槟分校(UIUC)协调科学实验室电气与计算机工程AMD创始人Jerry Sanders讲席教授(Walter J. SandersⅢAdvanced Micro Devices Endowed Chair)。胡文美教授还是IEEE(国际电气电子工程师学会)院士,ACM(美国计算机学会)院士。
目录信息
1.1 异构并行计算 2
1.2 现代GPU的体系结构 6
1.3 为什么需要更高的速度和并行化 8
1.4 应用程序的加速 9
1.5 并行编程语言和模型 11
1.6 本书的总体目标 12
1.7 本书的组织结构 13
参考文献 16
第2章 GPU计算的发展历程 19
2.1 图形流水线的发展 19
2.1.1 固定功能的图形流水线时代 20
2.1.2 可编程实时图形流水线的发展 23
2.1.3 图形与计算结合的处理器 25
2.2 GPGPU:一个中间步骤 27
2.3 GPU计算 28
2.3.1 可扩展的GPU 29
2.3.2 发展近况 29
2.3.3 未来发展趋势 30
参考文献与课外阅读 30
第3章 CUDA简介 35
3.1 数据并行性 36
3.2 CUDA的程序结构 37
3.3 向量加法kernel函数 39
3.4 设备全局存储器与数据传输 41
3.5 kernel函数与线程 46
3.6 小结 50
3.6.1 函数声明 50
3.6.2 启动kernel函数 50
3.6.3 预定义变量 51
3.6.4 运行时API 51
3.7 习题 51
参考文献 53
第4章 数据并行执行模型 55
4.1 CUDA的线程组织 56
4.2 线程与多维数据的映射 59
4.3 矩阵乘法——一个更加复杂的kernel函数 65
4.4 线程同步和透明的可扩展性 70
4.5 线程块的资源分配 73
4.6 查询设备属性 74
4.7 线程调度和容许时延 75
4.8 小结 78
4.9 习题 79
第5章 CUDA存储器 81
5.1 存储器访问效率的重要性 82
5.2 CUDA设备存储器的类型 83
5.3 减少全局存储器流量的一种策略 89
5.4 分块矩阵乘法的kernel函数 93
5.5 存储器——限制并行性的一个因素 98
5.6 小结 100
5.7 习题 101
第6章 性能优化 103
6.1 WARP和线程执行 104
6.2 全局存储器的带宽 111
6.3 执行资源的动态划分 118
6.4 指令混合和线程粒度 120
6.5 小结 121
6.6 习题 121
参考文献 124
第7章 浮点运算 127
7.1 浮点格式 128
7.1.1 M的规范化表示 128
7.1.2 E的余码表示 129
7.2 能表示的数 130
7.3 特殊的位模式与IEEE格式中的精度 134
7.4 算术运算的准确度和舍入 135
7.5 算法的优化 136
7.6 数值稳定性 137
7.7 小结 141
7.8 习题 141
参考文献 142
第8章 并行模式:卷积 143
8.1 背景 144
8.2 一个基本算法:一维并行卷积 148
8.3 常数存储器和高速缓存 149
8.4 使用光环元素的分块一维卷积 153
8.5 一个更简单的分块一维卷积——通用高速缓存 158
8.6 小结 160
8.7 习题 161
第9章 并行模式:前缀和 163
9.1 背景 164
9.2 简单并行扫描 165
9.3 考虑工作效率 169
9.4 工作高效的并行扫描 170
9.5 任意输入长度的并行扫描 174
9.6 小结 177
9.7 习题 177
参考文献 178
第10章 并行模式:稀疏矩阵-向量乘法 179
10.1 背景 180
10.2 使用CSR格式的并行SpMV 183
10.3 填充与转置 184
10.4 用混合方法来控制填充 186
10.5 通过排序和划分来规则化 189
10.6 小结 191
10.7 习题 191
参考文献 192
第11章 应用案例研究:高级MRI重构 193
11.1 应用背景 194
11.2 迭代重构 197
11.3 计算FHD 198
11.4 最终评估 214
11.5 习题 217
参考文献 218
第12章 应用案例研究:分子可视化和分析 219
12.1 应用背景 220
12.2 kernel函数简单的实现方案 221
12.3 线程粒度调节 225
12.4 存储器合并 227
12.5 小结 230
12.6 习题 231
参考文献 232
第13章 并行编程和计算思想 233
13.1 并行计算的目标 234
13.2 问题分解 235
13.3 算法选择 238
13.4 计算思想 243
13.5 小结 244
13.6 习题 244
参考文献 244
第14章 OpenCL简介 245
14.1 背景 246
14.2 数据并行性模型 247
14.3 设备的体系结构 249
14.4 kernel函数 250
14.5 设备管理和启动kernel 251
14.6 OpenCL中的静电势图谱 254
14.7 小结 258
14.8 习题 258
参考文献 259
第15章 OpenACC并行编程 261
15.1 OpenACC与CUDA C的比较 261
15.2 执行模型 263
15.3 存储器模型 265
15.4 基本的OpenACC程序 266
15.4.1 并行构造 266
15.4.2 循环构造 267
15.4.3 kernels构造 272
15.4.4 数据管理 275
15.4.5 数据构造 276
15.4.6 异步计算和数据传输 278
15.5 OpenACC的发展方向 279
15.6 习题 280
第16章 Thrust:一个面向效率的CUDA编程库 281
16.1 背景简介 282
16.2 动机 284
16.3 Thrust的基本特性 284
16.3.1 迭代器和内存空间 286
16.3.2 互操作性 286
16.4 泛型编程 288
16.5 抽象的益处 290
16.5.1 编程效率 290
16.5.2 鲁棒性 291
16.5.3 真实性能 291
16.6 最佳范例 293
16.6.1 融合 293
16.6.2 数组结构体 294
16.6.3 隐式范围 296
16.7 习题 297
参考文献 298
第17章 CUDA FORTRAN 299
17.1 CUDA FORTRAN和CUDA C的区别 300
17.2 第一个CUDA FORTRAN程序 301
17.3 CUDA FORTRAN中的多维数组 303
17.4 用通用接口重载主机/设备端例程 304
17.5 通过iso_c_binding调用CUDA C 307
17.6 kernel循环指令和归约操作 309
17.7 动态共享存储器 310
17.8 异步数据传输 311
17.9 编译和性能剖析 316
17.10 在CUDA FORTRAN中调用Thrust 317
17.11 习题 321
第18章 C++ AMP简介 323
18.1 C++ AMP核心特性 324
18.2 C++ AMP执行模式详解 329
18.2.1 显式和隐式的数据复制 330
18.2.2 异步操作 331
18.2.3 本节小结 333
18.3 加速器管理 333
18.4 分块执行 335
18.5 C++ AMP图形特性 338
18.6 小结 340
18.7 习题 341
第19章 异构集群编程 343
19.1 背景简介 344
19.2 运行示例 344
19.3 MPI基础 346
19.4 MPI点对点通信模型 348
19.5 重叠计算和通信 355
19.6 MPI集合通信模型 362
19.7 小结 363
19.8 习题 363
参考文献 364
第20章 CUDA动态并行 365
20.1 背景 366
20.2 动态并行简介 367
20.3 重要细节 368
20.3.1 启动环境变量设置 369
20.3.2 API错误和启动失败 369
20.3.3 事件 369
20.3.4 流 369
20.3.5 同步范围 370
20.4 内存可见性 371
20.4.1 全局内存 371
20.4.2 零拷贝内存 371
20.4.3 常量内存 371
20.4.4 局部内存 371
20.4.5 共享内存 372
20.4.6 纹理内存 372
20.5 一个简单示例 373
20.6 运行时限制 376
20.6.1 内存占用 376
20.6.2 嵌套深度 376
20.6.3 内存分配和生存周期 376
20.6.4 ECC错误 377
20.6.5 流 377
20.6.6 事件 377
20.6.7 启动池 377
20.7 一个更复杂的示例 378
20.7.1 线性贝塞尔曲线 378
20.7.2 二次贝塞尔曲线 378
20.7.3 贝塞尔曲线计算(非动态并行版本) 378
20.7.4 贝塞尔曲线计算(使用动态并行) 381
20.8 小结 384
参考文献 384
第21章 结论与展望 385
21.1 重点回顾 385
21.2 存储器模型的演变 386
21.2.1 大型虚拟和物理地址空间 386
21.2.2 统一的设备存储空间 388
21.2.3 可配置的缓存和暂时存储器 388
21.2.4 提高原子操作的速度 389
21.2.5 提高全局内存的访问速度 389
21.3 kernel函数执行控制过程的演变 389
21.3.1 kernel函数内部的函数调用 389
21.3.2 kernel函数中的异常处理 390
21.3.3 多个kernel函数的同步执行 390
21.3.4 可中断的kernel函数 391
21.4 内核的性能 391
21.4.1 双精度的速度 391
21.4.2 更好的控制流效率 392
21.5 编程环境 392
21.6 美好前景 392
参考文献 393
附录A 矩阵乘法主机版的源代码 395
附录B GPU的计算能力 407
· · · · · · (收起)
读后感
这本书初看不知所云,感觉没什么实质性内容。 后来配上在coursera上的视频,发现书中的见解相当精辟、简洁。 里面对于线程的讲解还有一些并行计算的方式都谈得很到位,作者实属苦口婆心将其原理一一道来。 看书还是讲求一个思维角度的问题。角度不对,则完全不能理解其中深...
CUDA生在NV,幼年长在UIUC,这本书的那个华人作者虽然说不是CUDA唯一的那个father,但也可以讲是one of 把CUDA养大的人。 你唯一可以诟病的是它没有手把手的教你写code,但那么做的书都真的太浅了。这本书可以说无遗漏的把基础都带了一遍而且很明白。至少在我个人眼里,这本书...
CUDA生在NV,幼年长在UIUC,这本书的那个华人作者虽然说不是CUDA唯一的那个father,但也可以讲是one of 把CUDA养大的人。 你唯一可以诟病的是它没有手把手的教你写code,但那么做的书都真的太浅了。这本书可以说无遗漏的把基础都带了一遍而且很明白。至少在我个人眼里,这本书...
这本书非常罗嗦,既不很通俗也不很深入。更要命的是,翻译得过于粗糙了。图7-9整个给翻译丢了不说,好多地方都是错字,还有些根本读不下来啊。 比如,7.3节,“通过设置最重要的尾数位来表示”。哪位是“最重要的尾数位”啊?most significant mantissa bit是尾数的最高有效位...
这本书非常罗嗦,既不很通俗也不很深入。更要命的是,翻译得过于粗糙了。图7-9整个给翻译丢了不说,好多地方都是错字,还有些根本读不下来啊。 比如,7.3节,“通过设置最重要的尾数位来表示”。哪位是“最重要的尾数位”啊?most significant mantissa bit是尾数的最高有效位...
用户评价
坦白说,这本书的深度绝对是顶级的,它对并行编程哲学层面的探讨,是我在其他任何书籍中都未曾见过的。它不仅仅是教你“如何做”,更引导你去思考“为什么”。例如,作者在探讨全局同步和线程束(Warp)调度时,引入了关于资源竞争和负载均衡的深刻见解,这使得我对编写健壮且可扩展的并行代码有了更清晰的认识。阅读体验上,尽管技术细节繁多,但作者的逻辑结构安排得极其清晰,专业术语的引入都有充分的铺垫,使得读者即便面对复杂的概念,也能保持心流。对于希望系统性掌握异构计算核心技能的研究人员和高级开发者来说,这本书是不可或缺的参考书,它为构建下一代高性能计算应用奠定了坚实的基础。
我必须强调,本书的“第2版”体现了其与时俱进的进化。在并行计算领域,硬件和软件栈的迭代速度极快,许多旧版教材很快就会过时。而这本书明显投入了大量的精力来更新内容,确保其覆盖了最新的硬件特性和编译器优化策略。我特别关注了关于异步操作和流(Stream)管理的那几章,其中对重叠计算和数据传输的讲解,结合新的API特性,让我能够设计出更高效的流水线任务。对于那些处理超大规模数据集的AI/ML从业者而言,书中关于数据搬运和核函数启动开销的深入讨论,提供了直接的性能红利。总而言之,这本书的价值在于它的“新”——它确保读者学到的知识是当下最前沿、最实用的技术。
我对这本书的评价是,它在深入技术细节的同时,保持了极高的可读性和实用性。我特别欣赏作者在处理复杂算法并行化时的那种庖丁解牛般的分解能力。例如,在讲解并行扫描和归约操作时,书中不仅展示了教科书式的实现,还引入了最新的、针对特定硬件架构优化的技巧,比如如何利用warp内的指令来减少线程间的同步开销。更难能可贵的是,它没有止步于CUDA C++,而是扩展讨论了其他并行编程模型和生态系统,虽然重点突出,但这些旁征博引极大地拓宽了读者的视野,让我看到了未来并行计算可能的发展方向。对于那些希望从“会写核函数”跨越到“写出高性能核函数”的工程师来说,这本书提供的洞察力是无价的。每次遇到性能瓶颈,我都能在这本书中找到启发性的解决方案。
这本书的案例研究部分绝对是亮点中的亮点,它展现了并行计算在真实世界问题中的强大威力。作者挑选的实例都是极具代表性的领域,例如分子动力学模拟和大规模矩阵运算,这些都是对计算资源要求极高的应用。不同于许多只停留在理论推导的著作,这本书的每一章的最后,都有详细的性能分析报告,清晰地展示了不同优化策略带来的速度提升百分比,这种量化的结果对于我们评估优化效果至关重要。此外,书中对调试和分析工具的使用指导也非常到位,它教会我们如何有效地利用Profiler来定位热点和瓶颈,而不是单纯地靠猜测进行修改。这种注重实战、强调量化分析的写作风格,让这本书更像是一位经验丰富的前辈在手把手指导入门者。
这本书简直是为我量身定做的,我一直在寻找一本既能打下坚实的理论基础,又能深入探讨实际应用的教材,而这本《大规模并行处理器编程实战(第2版)》完美地满足了我的需求。从第一章开始,作者就非常细致地剖析了现代并行架构的底层原理,清晰地阐述了SIMT模型与传统多核处理器的区别,这种从宏观到微观的讲解方式让我受益匪浅。尤其是关于内存层次结构和数据布局的章节,讲解得极为透彻,让我对如何优化数据访问模式有了全新的认识。它不仅仅是罗列API,更是深入讲解了为什么某些编程范式在GPU上效率更高,例如,它详尽地对比了共享内存和全局内存的使用场景,并给出了大量的代码实例来佐证。读完这些基础内容后,我对并行编程的理解已经提升到了一个新的高度,不再是盲目地堆砌核函数,而是能够有策略地进行性能调优。
作者在Coursera上开了门课 Heterogeneous Parallel Programming https://class.coursera.org/hetero-002
理论高于实战!建议读完GPU高性能编程CUDA实战,再来啃这本
作者在Coursera上开了门课 Heterogeneous Parallel Programming https://class.coursera.org/hetero-002
随着硬件的进步显得有点老了,对于明确基本概念和思路还是有帮助的
理论高于实战!建议读完GPU高性能编程CUDA实战,再来啃这本