图书目录

目   录

第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