图书目录

目    录

绪论 1

一、NVIDIA与GPU的崛起:驱动计算革新的核心力量 1

二、并行编程的意义:从串行计算到高性能计算的转型 4

三、CUDA的诞生与发展:统一架构下的并行计算 6

第 1 部分  CUDA基础理论与优化方法

第 1 章  GPU硬件架构与CUDA开发环境配置 10

1.1  CUDA设备架构详解:流式多处理器、Warp机制与寄存器 10

1.1.1  SM的线程调度单元与计算核心分析 10

1.1.2  Warp与线程的并行执行模式与分支处理机制 11

1.1.3  寄存器分配与线程数的关系对性能的影响 13

1.1.4  初步演练:基于CUDA的核函数设计 14

1.2  CUDA工具链剖析:nvcc编译器、CUDA运行时与驱动程序的差异 21

1.2.1  nvcc编译器的优化选项与目标代码生成分析 21

1.2.2  CUDA运行时API与驱动API的调用流程与性能对比 24

1.2.3  不同CUDA版本的驱动兼容性与迁移 26

1.3  多平台开发环境配置:Windows、Linux与容器化环境的安装与调试 31

1.3.1  Windows与Linux平台CUDA开发环境的配置与常见问题 31

1.3.2  使用容器化工具(如Docker)搭建跨平台CUDA开发环境 33

1.4  使用nvidia-smi进行GPU监控与设置:设备状态查询、温度与功耗优化 35

1.4.1  查询GPU内存占用、温度与功耗的实时状态信息 36

1.4.2  动态调整GPU的性能状态与功耗限制 37

1.4.3  利用脚本自动化监控与批量配置多GPU设备 41

1.5  本章小结 47

1.6  思考题 48

第 2 章  线程与网格组织 49

2.1  CUDA线程模型:线程、线程块与网格的硬件绑定 49

2.1.1  线程块与SM映射关系对并行计算的影响 49

2.1.2  CUDA线程的生命周期与线程分组的硬件依赖 54

2.2  多维网格设计:线程索引计算与数据映射案例(矩阵乘法) 58

2.2.1  多维线程网格的设计方法与索引计算逻辑 58

2.2.2  基于二维和三维网格的矩阵乘法性能优化 61

2.3  线程块大小的选择与资源分配:共享内存与寄存器利用率的平衡 65

2.3.1  如何根据GPU硬件限制选择线程块大小 65

2.3.2  分析寄存器与共享内存对线程块大小的影响 69

2.4  动态并行实现:在核函数中启动新的网格 72

2.4.1  动态并行API调用的性能分析与应用场景 73

2.4.2  动态网格嵌套的调度与资源分配优化 75

2.5  Warp机制深度详解与分支发散优化 78

2.5.1  Warp分支发散的检测与分支规约技术 79

2.5.2  使用Warp Shuffle指令优化线程间数据交换 82

2.6  本章小结 86

2.7  思考题 86

第 3 章  内存管理与优化 88

3.1  CUDA内存层级剖析:全局内存、共享内存、寄存器与局部内存的特性 88

3.1.1  全局内存与共享内存的访问特性与延迟分析 88

3.1.2  寄存器分配与局部内存溢出对性能的影响 91

3.2  全局内存合并访问:矩阵转置性能优化 94

3.2.1  访存对齐与内存带宽利用率优化技术 94

3.2.2  基于合并访问的全局内存访问优化案例 97

3.3  共享内存动态分配:数组归约计算优化实现 99

3.3.1  动态共享内存分配的机制与对线程块的影响 100

3.3.2  使用共享内存实现高效归约计算的步骤与优化 103

3.4  L1、L2缓存行为调优:减少内存访问延迟 106

3.4.1  缓存配置选项与性能优化 106

3.4.2  使用缓存命中率分析工具评估访存效率 110

3.5  本章小结 115

3.6  思考题 115

第 4 章  CUDA程序的框架与数据传输 117

4.1  核函数设计与线程调度:基于线程索引的数据分片处理 117

4.1.1  使用线程索引分配数据块与循环展开优化 117

4.1.2  核函数内存带宽与线程调度的优化实例 120

4.2  主机与设备之间的数据传输优化:锁页内存与异步传输 123

4.2.1  使用锁页内存减少数据传输开销的方法 124

4.2.2  异步数据传输的实现与核函数执行的重叠 125

4.3  内存分配与释放:Unified Memory、cudaMallocManaged与cudaMemcpy的对比 128

4.3.1  Unified Memory与传统显式内存分配的对比案例 129

4.3.2  使用cudaMallocManaged实现跨设备数据共享 131

4.4  本章小结 138

4.5  思考题 138

第 5 章  常见错误检测与调试工具 140

5.1  利用CUDA运行时API检测错误:宏定义实现通用错误处理 140

5.1.1  常见CUDA错误代码及其含义与处理方法 140

5.1.2  基于宏函数的通用错误检测与日志记录实现 143

5.2  CUDA-MEMCHECK的使用:定位内存溢出与数据竞争问题 145

5.2.1  使用CUDA-MEMCHECK工具检测内存越界访问与未初始化变量 146

5.2.2  数据竞争检测与消除方法的实际案例 148

5.3  核函数中的线程调试:Warp分支发散的识别与优化 150

5.3.1  使用printf调试核函数中的线程执行路径 150

5.3.2  使用Nsight工具分析分支发散和Warp效率 152

5.4  使用Nsight调试工具分析性能瓶颈 154

5.4.1  Nsight Compute的热点分析与性能优化步骤 154

5.4.2  使用Nsight Systems分析异步任务与流的重叠执行 156

5.4.3  案例:综合使用调试与分析工具优化CUDA程序 159

5.5  本章小结 162

5.6  思考题 163

第 6 章  并行程序性能优化 165

6.1  数据传输与计算比例的优化:流式大规模矩阵乘法 165

6.1.1  数据传输与计算比值的分析与优化模型 165

6.1.2  流式分块矩阵乘法的数据调度与计算重叠 168

6.2  算术强度与GPU利用率:高算术强度的算法设计原则 170

6.2.1  高算术强度算法的特征与GPU硬件适配 171

6.2.2  使用合并操作优化算术强度不足的算法 173

6.3  Warp收敛性与指令效率:解决线程分支发散的实际案例 175

6.3.1  Warp收敛效率分析与优化技术 175

6.3.2  指令融合与条件分支规约的性能提升方法 178

6.4  并行规模的调优:块矩阵分解的性能优化 180

6.4.1  分块策略与线程块规模对性能的影响 180

6.4.2  动态调整并行规模适应不同数据集的实现 182

6.5  本章小结 186

6.6  思考题 186

第 2 部分  高级优化与并行技术

第 7 章  全局内存与共享内存的深入应用 189

7.1  全局内存访问对齐与合并 189

7.1.1  合并访问的硬件机制与对齐优化技巧 189

7.1.2  非对齐访问场景的性能分析与规避 192

7.2  共享内存的Bank冲突解决:矩阵块划分与线程分组优化案例 194

7.2.1  共享内存Bank冲突的检测与分析工具使用 194

7.2.2  矩阵块划分与线程分组对Bank冲突的消除 197

7.3  使用共享内存进行复杂计算:块矩阵转置与求和 200

7.3.1  块矩阵操作中的共享内存分配与使用 200

7.3.2  使用共享内存提升矩阵转置与求和性能 202

7.3.3  求解大型矩阵的奇异值分解加速运算 205

7.4  本章小结 210

7.5  思考题 210

第 8 章  原子操作与线程同步 212

8.1  CUDA原子函数的实现机制:基于原子加的直方图计算 212

8.1.1  原子函数在硬件上的实现原理与性能影响 212

8.1.2  使用原子加实现并行直方图的完整代码示例 215

8.2  Warp级同步与线程块同步:避免数据竞争的高效实现 218

8.2.1  Warp级同步的实现与性能提升案例 218

8.2.2  使用_ _syncthreads避免线程块间数据竞争 221

8.3  高效归约算法:基于Shuffle指令的无锁归约实现 224

8.3.1  Shuffle指令的实现机制与无锁归约的应用 224

8.3.2  Warp级归约在大规模数据处理中的优化应用 227

8.4  协作组的高级用法:使用线程块协作完成前缀和 229

8.4.1  使用协作组完成高效数据共享与同步 229

8.4.2  基于线程块的前缀和计算案例实现 232

8.5  本章小结 237

8.6  思考题 237

第 9 章  CUDA流与异步操作 239

9.1  非默认流的设计与实现:多核函数异步并发执行案例 239

9.1.1  非默认流的创建与核函数绑定技术 239

9.1.2  多流并发执行的性能对比与优化 241

9.2  异步数据传输与核函数执行的重叠:优化矩阵分块传输 243

9.2.1  异步API实现数据传输与核函数的并行 244

9.2.2  流内任务重叠的矩阵分块传输优化实现 246

9.3  流优先级与调度策略:复杂场景下的多任务优化案例 248

9.3.1  设置流优先级的策略与实现细节 249

9.3.2  多任务场景下的流调度与资源分配优化 251

9.3.3  基于CUDA流和异步操作优化大规模矩阵加法 253

9.4  本章小结 257

9.5  思考题 257

第 10 章  CUDA标准库与算法优化 259

10.1  Thrust库:设备向量与迭代器 259

10.1.1  Thrust设备向量的存储与操作详解 259

10.1.2  使用Thrust迭代器实现复杂数据转换 263

10.2  cuBLAS库:大规模矩阵乘法 265

10.2.1  cuBLAS矩阵运算API解析与参数配置 265

10.2.2  使用cuBLAS库实现高效矩阵乘法 267

10.3  cuRAND库:伪随机数与高斯分布的生成算法 270

10.3.1  cuRAND库伪随机数生成的原理与实现 270

10.3.2  高斯分布生成在数据模拟中的实际应用 272

10.3.3  基于CUDA的FR共轭梯度下降最优算法优化案例 273

10.4  本章小结 278

10.5  思考题 279

第 3 部分  分布式计算与实践应用

第 11 章  高级并行编程技术 281

11.1  多GPU并行计算:矩阵分块处理与设备间数据传输 281

11.1.1  基于多GPU的矩阵分块传输与计算调度 281

11.1.2  使用MPI实现多GPU间的数据分配与同步 284

11.2  GPU与CPU协同计算:通过异构并行实现复杂任务分解 287

11.2.1  异构计算的任务划分策略与性能对比 287

11.2.2  CPU与GPU协同执行复杂计算的完整实现 291

11.3  分布式CUDA程序:基于MPI的多节点计算 296

11.3.1  使用MPI与CUDA实现多节点矩阵计算 296

11.3.2  分布式CUDA程序的性能测试与优化 299

11.4  动态调度与负载均衡:解决多任务分配的性能瓶颈 301

11.4.1  任务动态分配与负载均衡算法实现 301

11.4.2  高并发环境下的资源调度优化 303

11.5  本章小结 308

11.6  思考题 308

第 12 章  应用案例:分子动力学模拟 310

12.1  基础算法分析:分子间作用力计算的并行实现 310

12.1.1  分子间作用力计算的GPU并行化 310

12.1.2  数据分块与作用力求解中的线程分配 313

12.2  CUDA优化:使用块分解法加速力矩与能量计算 315

12.2.1  基于块分解法的能量计算优化 315

12.2.2  使用共享内存加速力矩计算的案例实现 318

12.3  性能测试与验证:能量守恒与计算效率分析 320

12.3.1  分子动力学模拟中能量守恒的验证方法 321

12.3.2  使用性能分析工具评估模拟效率 323

12.4  综合优化:多GPU版本分子动力学模拟的完整实现 325

12.4.1  使用多GPU分解模型进行并行计算的实现 325

12.4.2  多GPU协同计算下的性能优化与结果验证 328

12.5  本章小结 335

12.6  思考题 335