第1章 超级计算简史 1
1.1 简介 1
1.2 冯·诺依曼计算机架构 2
1.3 克雷 4
1.4 连接机 5
1.5 Cell处理器 6
1.6 多点计算 8
1.7 早期的GPGPU编程 10
1.8 单核解决方案的消亡 11
1.9 英伟达和CUDA 12
1.10 GPU硬件 13
1.11 CUDA的替代选择 15
1.11.1 OpenCL 15
1.11.2 DirectCompute 16
1.11.3 CPU的替代选择 16
1.11.4 编译指令和库 17
1.12 本章小结 18
第2章 使用GPU理解并行计算 19
2.1 简介 19
2.2 传统的串行代码 19
2.3 串行/并行问题 21
2.4 并发性 22
2.5 并行处理的类型 25
2.5.1 基于任务的并行处理 25
2.5.2 基于数据的并行处理 27
2.6 弗林分类法 29
2.7 常用的并行模式 30
2.7.1 基于循环的模式 30
2.7.2 派生/汇集模式 31
2.7.3 分条/分块 33
2.7.4 分而治之 34
2.8 本章小结 34
第3章 CUDA硬件概述 35
3.1 PC架构 35
3.2 GPU硬件结构 39
3.3 CPU与GPU 41
3.4 GPU计算能力 42
3.4.1 计算能力1.0 42
3.4.2 计算能力1.1 43
3.4.3 计算能力1.2 44
3.4.4 计算能力1.3 44
3.4.5 计算能力2.0 44
3.4.6 计算能力2.1 46
第4章 CUDA环境搭建 48
4.1 简介 48
4.2 在Windows下安装软件开发工具包 48
4.3 Visual Studio 49
4.3.1 工程 49
4.3.2 64位用户 49
4.3.3 创建工程 51
4.4 Linux 52
4.5 Mac 55
4.6 安装调试器 56
4.7 编译模型 58
4.8 错误处理 59
4.9 本章小结 60
第5章 线程网格、线程块以及线程 61
5.1 简介 61
5.2 线程 61
5.2.1 问题分解 62
5.2.2 CPU与GPU的不同 63
5.2.3 任务执行模式 64
5.2.4 GPU线程 64
5.2.5 硬件初窥 66
5.2.6 CUDA内核 69
5.3 线程块 70
5.4 线程网格 74
5.4.1 跨幅与偏移 76
5.4.2 X与Y方向的线程索引 77
5.5 线程束 83
5.5.1 分支 83
5.5.2 GPU的利用率 85
5.6 线程块的调度 88
5.7 一个实例——统计直方图 89
5.8 本章小结 96
第6章 CUDA内存处理 99
6.1 简介 99
6.2 高速缓存 100
6.3 寄存器的用法 103
6.4 共享内存 112
6.4.1 使用共享内存排序 113
6.4.2 基数排序 117
6.4.3 合并列表 123
6.4.4 并行合并 128
6.4.5 并行归约 131
6.4.6 混合算法 134
6.4.7 不同GPU上的共享内存 138
6.4.8 共享内存小结 139
6.5 常量内存 140
6.5.1 常量内存高速缓存 140
6.5.2 常量内存广播机制 142
6.5.3 运行时进行常量内存更新 152
6.6 全局内存 157
6.6.1 记分牌 165
6.6.2 全局内存排序 165
6.6.3 样本排序 168
6.7 纹理内存 188
6.7.1 纹理缓存 188
6.7.2 基于硬件的内存获取操作 189
6.7.3 使用纹理的限制 190
6.8 本章小结 190
第7章 CUDA实践之道 191
7.1 简介 191
7.2 串行编码与并行编码 191
7.2.1 CPU与GPU的设计目标 191
7.2.2 CPU与GPU上的最佳算法对比 194
7.3 数据集处理 197
7.4 性能分析 206
7.5 一个使用AES的示例 218
7.5.1 算法 219
7.5.2 AES的串行实现 223
7.5.3 初始内核函数 224
7.5.4 内核函数性能 229
7.5.5 传输性能 233
7.5.6 单个执行流版本 234
7.5.7 如何与CPU比较 235
7.5.8 考虑在其他GPU上运行 244
7.5.9 使用多个流 248
7.5.10 AES总结 249
7.6 本章小结 249
第8章 多CPU和多GPU解决方案 252
8.1 简介 252
8.2 局部性 252
8.3 多CPU系统 252
8.4 多GPU系统 253
8.5 多GPU算法 254
8.6 按需选用GPU 255
8.7 单节点系统 258
8.8 流 259
8.9 多节点系统 273
8.10 本章小结 284
第9章 应用程序性能优化 286
9.1 策略1:并行/串行在GPU/CPU上的问题分解 286
9.1.1 分析问题 286
9.1.2 时间 286
9.1.3 问题分解 288
9.1.4 依赖性 289
9.1.5 数据集大小 292
9.1.6 分辨率 293
9.1.7 识别瓶颈 294
9.1.8 CPU和GPU的任务分组 297
9.1.9 本节小结 299
9.2 策略2:内存因素 299
9.2.1 内存带宽 299
9.2.2 限制的来源 300
9.2.3 内存组织 302
9.2.4 内存访问以计算比率 303
9.2.5 循环融合和内核融合 308
9.2.6 共享内存和高速缓存的使用 309
9.2.7 本节小结 311
9.3 策略3:传输 311
9.3.1 锁页内存 311
9.3.2 零复制内存 315
9.3.3 带宽限制 322
9.3.4 GPU计时 327
9.3.5 重叠GPU传输 330
9.3.6 本节小结 334
9.4 策略4:线程使用、计算和分支 335
9.4.1 线程内存模式 335
9.4.2 非活动线程 337
9.4.3 算术运算密度 338
9.4.4 一些常见的编译器优化 342
9.4.5 分支 347
9.4.6 理解底层汇编代码 351
9.4.7 寄存器的使用 355
9.4.8 本节小结 357
9.5 策略5:算法 357
9.5.1 排序 358
9.5.2 归约 363
9.5.3 本节小结 384
9.6 策略6:资源竞争 384
9.6.1 识别瓶颈 384
9.6.2 解析瓶颈 396
9.6.3 本节小结 403
9.7 策略7:自调优应用程序 403
9.7.1 识别硬件 404
9.7.2 设备的利用 405
9.7.3 性能采样 407
9.7.4 本节小结 407
9.8 本章小结 408
第10章 函数库和SDK 410
10.1 简介 410
10.2 函数库 410
10.2.1 函数库通用规范 411
10.2.2 NPP 411
10.2.3 Thrust 419
10.2.4 CuRAND 434
10.2.5 CuBLAS库 438
10.3 CUDA运算SDK 442
10.3.1 设备查询 443
10.3.2 带宽测试 445
10.3.3 SimpleP2P 446
10.3.4 asyncAPI和cudaOpenMP 448
10.3.5 对齐类型 455
10.4 基于指令的编程 457
10.5 编写自己的内核 464
10.6 本章小结 466
第11章 规划GPU硬件系统 467
11.1 简介 467
11.2 CPU处理器 469
11.3 GPU设备 470
11.3.1 大容量内存的支持 471
11.3.2 ECC内存的支持 471
11.3.3 Tesla计算集群驱动程序 471
11.3.4 更高双精度数学运算 472
11.3.5 大内存总线带宽 472
11.3.6 系统管理中断 472
11.3.7 状态指示灯 472
11.4 PCI-E总线 472
11.5 GeForce板卡 473
11.6 CPU内存 474
11.7 风冷 475
11.8 液冷 477
11.9 机箱与主板 479
11.10 大容量存储 481
11.10.1 主板上的输入/输出接口 481
11.10.2 专用RAID控制器 481
11.10.3 HDSL 483
11.10.4 大容量存储需求 483
11.10.5 联网 483
11.11 电源选择 484
11.12 操作系统 487
11.12.1 Windows 487
11.12.2 Linux 488
11.13 本章小结 488
第12章 常见问题、原因及解决方案 489
12.1 简介 489
12.2 CUDA指令错误 489
12.2.1 CUDA错误处理 489
12.2.2 内核启动和边界检查 490
12.2.3 无效的设备操作 491
12.2.4 volatile限定符 492
12.2.5 计算能力依赖函数 494
12.2.6 设备函数、全局函数和主机函数 495
12.2.7 内核中的流 496
12.3 并行编程问题 497
12.3.1 竞争冒险 497
12.3.2 同步 498
12.3.3 原子操作 502
12.4 算法问题 504
12.4.1 对比测试 504
12.4.2 内存泄漏 506
12.4.3 耗时的内核程序 506
12.5 查找并避免错误 507
12.5.1 你的GPU程序有多少错误 507
12.5.2 分而治之 508
12.5.3 断言和防御型编程 509
12.5.4 调试级别和打印 511
12.5.5 版本控制 514
12.6 为未来的GPU进行开发 515
12.6.1 开普勒架构 515
12.6.2 思考 518
12.7 后续学习资源 519
12.7.1 介绍 519
12.7.2 在线课程 519
12.7.3 教学课程 520
12.7.4 书籍 521
12.7.5 英伟达CUDA资格认证 521
12.8 本章小结 522