本书旨在引导读者基于 Python 和CUDA 的 GPU 编程开发高性能的应用程序,先后介绍了为什么要学习 GPU 编程、搭建 GPU编程环境、PyCUDA入门等内容,以及 CUDA 代码的调试与性能分析、通过 Scikit-CUDA 模块使用 CUDA 库、实现深度神经网络、CUDA 性能优化等内容。学完上述内容,读者应能从零开始构建基于 GPU的深度神经网络,甚至能够解决与数据科学和 GPU编程高性能计算相关的问题。
本书适合对GPU 编程与 CUDA编程感兴趣的读者阅读。读者应掌握必要的基本数学概念,且需要具备一定的 Python编程经验。
1.本书基于Python和CUDA介绍GPU编程
2.重点介绍如何通过GPU编程来实现高性能的并行计算
3.本书为读者供习题,并以“习题提示”的方式给出解题思路
4.异步社区为读者提供配套代码
Brian Tuomanen 博士自2014年以来,一直从事CUDA 和GPU 编程方面的工作。他在美国西雅图华盛顿大学(University of Washington)获得了电气工程专业的学士学位,在攻读数学专业的硕士学位之前,从事过软件工程方面的工作。后来,他在哥伦比亚的密苏里大学攻读数学博士学位,在那里与 GPU 编程"邂逅"——GPU编程当时主要用于研究科学问题。Tuomanen 博十曾经在美国陆军研究实验室以GPU编程为题发表演讲,后来在美国马里兰州的一家初创公司负责GPU集成和开发方面的工作。目前,他在西雅图担任微软的机器学习专家(Azure CSI)。
第 1章 为什么要学习GPU编程 1
1.1 技术要求 2
1.2 并行化与阿姆达尔定律 2
1.2.1 使用阿姆达尔定律 3
1.2.2 Mandelbrot集 5
1.3 对代码进行性能分析 7
1.4 小结 9
1.5 习题 10
第 2章 搭建GPU编程环境 11
2.1 技术要求 12
2.2 确保拥有合适的硬件 12
2.2.1 检查硬件(Linux系统) 13
2.2.2 检查硬件(Windows系统) 14
2.3 安装GPU驱动程序 15
2.3.1 安装GPU驱动程序(Linux系统) 16
2.3.2 安装GPU驱动程序(Windows系统) 17
2.4 搭建C++编程环境 18
2.4.1 设置GCC、Eclipse IDE和图形处理库(Linux系统) 18
2.4.2 设置Visual Studio(Windows系统) 18
2.4.3 安装CUDA Toolkit 20
2.5 为GPU编程设置Python环境 21
2.5.1 安装PyCUDA(Linux系统) 22
2.5.2 创建环境启动脚本(Windows系统) 22
2.5.3 安装PyCUDA(Windows系统) 23
2.5.4 测试PyCUDA 23
2.6 小结 24
2.7 习题 25
第3章 PyCUDA入门 26
3.1 技术要求 26
3.2 查询GPU 27
3.3 使用PyCUDA的gpuarray类 31
3.3.1 使用gpuarray在GPU之间传输数据 31
3.3.2 使用gpuarray进行基本的逐元素算术运算 32
3.4 使用PyCUDA的ElementwiseKernel执行逐元素运算 37
3.4.1 重温Mandelbrot集 40
3.4.2 函数式编程简介 44
3.4.3 并行化的扫描内核函数和规约内核函数简介 45
3.5 小结 47
3.6 习题 47
第4章 内核函数、线程、线程块与网格 49
4.1 技术要求 50
4.2 内核函数 50
4.3 线程、线程块与网格 53
4.4 线程同步与线程通信 60
4.4.1 使用设备函数__syncthreads 60
4.4.2 使用共享内存 63
4.5 并行前缀算法 65
4.5.1 朴素并行前缀算法 66
4.5.2 包含型并行前缀算法与独占型并行前缀算法 69
4.5.3 工作高效型并行前缀算法 69
4.5.4 工作高效型并行前缀算法的实现 71
4.6 小结 74
4.7 习题 74
第5章 流、事件、上下文与并发性 76
5.1 技术要求 77
5.2 CUDA设备同步 77
5.2.1 使用PyCUDA流类 78
5.2.2 通过CUDA流实现并发版本的LIFE 82
5.3 事件 85
5.4 上下文 89
5.4.1 同步当前上下文 90
5.4.2 手动创建上下文 91
5.4.3 主机端多进程与多线程技术 92
5.4.4 实现主机端并发的多上下文 93
5.5 小结 97
5.6 习题 97
第6章 CUDA代码的调试与性能分析 99
6.1 技术要求 100
6.2 在CUDA内核函数中使用printf函数 100
6.3 CUDA C编程简介 106
6.4 利用Nsight IDE开发和调试CUDA C代码 113
6.4.1 在Windows平台上的Visual Studio中使用Nsight 113
6.4.2 在Linux平台中使用Nsight和Eclipse 117
6.4.3 借助Nsight理解CUDA的线程束锁步特性 120
6.5 使用NVIDIA性能分析工具——nvprof与Visual Profiler 122
6.6 小结 124
6.7 习题 125
第7章 通过Scikit-CUDA模块使用CUDA库 126
7.1 技术要求 127
7.2 安装Scikit-CUDA 127
7.3 利用cuBLAS库处理基本线性代数运算 128
7.3.1 利用cuBLAS库处理第 1级AXPY运算 128
7.3.2 其他第 1级cuBLAS函数 130
7.3.3 利用cuBLAS库处理第 2级GEMV运算 131
7.3.4 利用cuBLAS中的第3级GEMM操作测量GPU性能 133
7.4 利用cuFFT库进行快速傅里叶变换 136
7.4.1 一维快速傅里叶变换示例 137
7.4.2 使用FFT进行卷积操作 138
7.4.3 利用cuFFT进行二维卷积 139
7.5 通过Scikit-CUDA使用cuSolver 144
7.5.1 奇异值分解 144
7.5.2 奇异值分解在主成分分析中的应用 146
7.6 小结 147
7.7 习题 148
第8章 CUDA设备函数库与Thrust库 149
8.1 技术要求 150
8.2 cuRAND设备函数库 150
8.3 CUDA Math API 155
8.3.1 定积分概述 155
8.3.2 用蒙特卡罗方法计算定积分 156
8.3.3 编写测试用例 162
8.4 CUDA Thrust库 164
8.5 小结 168
8.6 习题 169
第9章 实现深度神经网络 170
9.1 技术要求 170
9.2 人工神经元与神经网络 171
9.3 softmax层的实现 177
9.4 交叉熵损失函数的实现 179
9.5 序贯网络的实现 180
9.5.1 推理方法的实现 182
9.5.2 梯度下降法 184
9.5.3 数据的规范化和归一化 189
9.6 Iris数据集 190
9.7 小结 192
9.8 习题 193
第 10章 应用编译好的GPU代码 194
10.1 通过Ctypes模块启动编译好的 代码 194
10.2 编译并运行纯PTX代码 201
10.3 为CUDA Driver API编写 包装器 203
10.4 小结 210
10.5 习题 211
第 11章 CUDA性能优化 212
11.1 动态并行性 212
11.2 向量化数据类型与 内存访问 217
11.3 线程安全的原子操作 218
11.4 线程束洗牌 220
11.5 内联PTX汇编 223
11.6 经过优化的数组求和 函数 227
11.7 小结 231
11.8 习题 231
第 12章 未来展望 233
12.1 深入了解CUDA和GPGPU 编程技术 234
12.1.1 多GPU系统 234
12.1.2 集群计算和消息 传递接口 234
12.1.3 OpenCL和 PyOpenCLCUDA 234
12.2 图形领域 235
12.2.1 OpenGL 235
12.2.2 DirectX 12 235
12.2.3 Vulkan 236
12.3 机器学习与计算机视觉 236
12.3.1 基础知识 236
12.3.2 cuDNN 236
12.3.3 Tensorflow与Keras 237
12.3.4 Chainer 237
12.3.5 OpenCV 237
12.4 区块链技术 237
12.5 小结 238
12.6 习题 238
习题提示 239
第 1章 为什么要学习GPU编程 239
第 2章 搭建GPU编程环境 239
第3章 PyCUDA入门 240
第4章 内核函数、线程、线程块与网格 240
第5章 流、事件、上下文与并发性 241
第6章 CUDA代码的调试与性能分析 241
第7章 通过Scikit-CUDA模块使用CUDA库 242
第8章 CUDA设备函数库与Thrust库 242
第9章 实现深度神经网络 243
第 10章 应用编译好的GPU代码 243
第 11章 CUDA性能优化 244
第 12章 未来展望 244