本书是一本理想的学习 CUDA 编程的入门书籍。本书分两部分,第一部分(前十章)循序渐进地介绍 CUDA 编程的基础,第二部分(后五章)通过一个具体的计算物理应用实例——分子动力学模拟——来介绍如何从头开发一个大型的、高效的 CUDA 程序。
第1章 GPU硬件与CUDA程序开发工具1
1.1 GPU 硬件简介1
1.2 CUDA 程序开发工具4
1.3 CUDA 开发环境搭建示例6
1.4 用nvidia-smi检查与设置设备7
1.5 其他学习资料8
第2章 CUDA中的线程组织10
2.1 C 语言中的HelloWorld程序10
2.2 CUDA中的HelloWorld程序11
2.2.1 只有主机函数的CUDA程序11
2.2.2 使用核函数的CUDA程序12
2.3 CUDA 中的线程组织14
2.3.1 使用多个线程的核函数14
2.3.2 使用线程索引15
2.3.3 推广至多维网格17
2.3.4 网格与线程块大小的限制21
2.4 CUDA 中的头文件21
2.5 用nvcc编译CUDA程序22
第3章 简单CUDA程序的基本框架25
3.1 例子:数组相加25
3.2 CUDA 程序的基本框架27
3.2.1 隐形的设备初始化29
3.2.2 设备内存的分配与释放29
3.2.3 主机与设备之间数据的传递31
3.2.4 核函数中数据与线程的对应32
3.2.5 核函数的要求33
3.2.6 核函数中if语句的必要性34
3.3 自定义设备函数35
3.3.1 函数执行空间标识符35
3.3.2 例子:为数组相加的核函数定义一个设备函数36
第4章 CUDA程序的错误检测38
4.1 一个检测CUDA运行时错误的宏函数38
4.1.1 检查运行时API函数40
4.1.2 检查核函数42
4.2 用CUDA-MEMCHECK检查内存错误44
第5章 获得GPU加速的关键46
5.1 用CUDA事件计时46
5.1.1 为C 程序计时47
5.1.2 为CUDA程序计时48
5.2 几个影响GPU加速的关键因素50
5.2.1 数据传输的比例50
5.2.2 算术强度51
5.2.3 并行规模54
5.2.4 总结55
5.3 CUDA 中的数学函数库55
第6章 CUDA的内存组织57
6.1 CUDA 的内存组织简介57
6.2 CUDA 中不同类型的内存58
6.2.1 全局内存58
6.2.2 常量内存61
6.2.3 纹理内存和表面内存62
6.2.4 寄存器62
6.2.5 局部内存63
6.2.6 共享内存63
6.2.7 L1和L2缓存64
6.3 SM 及其占有率65
6.3.1 SM 的构成65
6.3.2 SM 的占有率65
6.4 用CUDA运行时API函数查询设备67
第7 章 全局内存的合理使用70
7.1 全局内存的合并与非合并访问70
7.2 例子:矩阵转置73
7.2.1 矩阵复制73
7.2.2 使用全局内存进行矩阵转置75
第8 章 共享内存的合理使用78
8.1 例子:数组归约计算78
8.1.1 仅使用全局内存79
8.1.2 使用共享内存82
8.1.3 使用动态共享内存84
8.2 使用共享内存进行矩阵转置85
8.3 避免共享内存的bank冲突86
第9 章 原子函数的合理使用90
9.1 完全在GPU中进行归约90
9.2 原子函数93
9.3 例子:邻居列表的建立95
9.3.1 C 版本的开发96
9.3.2 利用原子操作的CUDA版本98
9.3.3 不用原子操作的CUDA版本101
第10章 线程束基本函数与协作组104
10.1 单指令-多线程执行模式104
10.2 线程束内的线程同步函数106
10.3 更多线程束内的基本函数109
10.3.1 介绍109
10.3.2 利用线程束洗牌函数进行归约计算114
10.4 协作组116
10.4.1 线程块级别的协作组116
10.4.2 利用协作组进行归约计算118
10.5 数组归约程序的进一步优化119
10.5.1 提高线程利用率119
10.5.2 避免反复分配与释放设备内存122
第11章 CUDA流124
11.1 CUDA 流概述124
11.2 在默认流中重叠主机和设备计算125
11.3 用非默认CUDA流重叠多个核函数的执行128
11.3.1 核函数执行配置中的流参数128
11.3.2 重叠多个核函数的例子129
11.4 用非默认CUDA流重叠核函数的执行与数据传递131
11.4.1 不可分页主机内存与异步的数据传输函数131
11.4.2 重叠核函数执行与数据传输的例子133
第12章 使用统一内存编程136
12.1 统一内存简介136
12.1.1 统一内存的基本概念136
12.1.2 使用统一内存对硬件的要求137
12.1.3 统一内存编程的优势137
12.2 统一内存的基本使用方法137
12.2.1 动态统一内存138
12.2.2 静态统一内存139
12.3 使用统一内存申请超量的内存140
12.3.1 个测试140
12.3.2 第二个测试142
12.3.3 第三个测试143
12.4 优化使用统一内存的程序144
第13章 分子动力学模拟的CUDA程序开发147
13.1 分子动力学模拟的基本算法和C 实现147
13.1.1 程序的整体结构147
13.1.2 分子动力学模拟的基本流程148
13.1.3 初始条件149
13.1.4 边界条件150
13.1.5 相互作用152
13.1.6 运动方程的数值积分156
13.1.7 程序中使用的单位制157
13.1.8 程序的编译与运行158
13.1.9 能量守恒的测试159
13.1.10 C 版本程序运行速度的测试160
13.2 CUDA 版本的分子动力学模拟程序开发161
13.2.1 仅加速求力和能量的部分161
13.2.2 加速全部计算165
第14章 CUDA标准库的使用167
14.1 CUDA 标准库简介167
14.2 Thrust 库168
14.2.1 简介168
14.2.2 数据结构168
14.2.3 算法168
14.2.4 例子:前缀和169
14.3 cuBLAS 库171
14.3.1 简介171
14.3.2 例子:矩阵乘法172
14.4 cuSolver 库176
14.4.1 简介176
14.4.2 例子:矩阵本征值177
14.5 cuRAND 库181
14.5.1 简介181
14.5.2 例子182