《GPU编程实战:基于Python和CUDA》是由人民邮电出版社出版的一本关于GPU编程方面的书籍,作者是布莱恩·图奥迈宁,主要介绍了关于GPU编程、Python、CUDA方面的知识内容,目前在GPU编程类书籍综合评分为:9.6分。
书籍介绍
内容简介
本书旨在引导读者基于 Python 和CUDA 的 GPU 编程开发高性能的应用程序,先后介绍了为什么要学习 GPU 编程、搭建 GPU编程环境、PyCUDA入门等内容,以及 CUDA 代码的调试与性能分析、通过 Scikit-CUDA 模块使用 CUDA 库、实现深度神经网络、CUDA 性能优化等内容。学完上述内容,读者应能从零开始构建基于 GPU的深度神经网络,甚至能够解决与数据科学和 GPU编程高性能计算相关的问题。
本书适合对GPU 编程与 CUDA编程感兴趣的读者阅读。读者应掌握必要的基本数学概念,且需要具备一定的 Python编程经验。
目录
- 第 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 Toolkit20
- 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 测试PyCUDA23
- 2.6 小结24
- 2.7 习题25
- 第3章PyCUDA入门26
- 3.1 技术要求26
- 3.2 查询GPU27
- 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 使用设备函数__syncthreads60
- 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流实现并发版本的LIFE82
- 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中使用Nsight113
- 6.4.2 在Linux平台中使用Nsight和Eclipse117
- 6.4.3 借助Nsight理解CUDA的线程束锁步特性120
- 6.5 使用NVIDIA性能分析工具——nvprof与Visual Profiler122
- 6.6 小结124
- 6.7 习题125
- 第7章通过Scikit-CUDA模块使用CUDA库126
- 7.1 技术要求127
- 7.2 安装Scikit-CUDA127
- 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使用cuSolver144
- 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 API155
- 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和 PyOpenCLCUDA234
- 12.2 图形领域235
- 12.2.1OpenGL235
- 12.2.2DirectX 12235
- 12.2.3Vulkan236
- 12.3 机器学习与计算机视觉236
- 12.3.1基础知识236
- 12.3.2cuDNN236
- 12.3.3Tensorflow与Keras237
- 12.3.4Chainer237
- 12.3.5OpenCV237
- 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