GPU编程与优化:大众高性能计算.方民权(带详细书签).pdf
本书第一篇系统地介绍GPU编程的相关知识,帮助读者快速入门,并构建GPU知识体系;第二篇和第三篇给出大量实例,对每个实例进行循序渐进的并行和优化实践,为读者提供GPU编程和优化参考;第四篇总结影响GPU性能的关键要素(执行核心和存储体系),量化测评GPU的核心性能参数,给出CPU/GPU异构系统上覆盖完全的各种混合并行模式及其实践,帮助读者真正透彻理解GPU。 本书适合作为计算机及相关专业的教材,也可作为GPU程序开发人员和科研人员的参考书。本书封面贴有清华大学出版社防伪标签,无标签者不得销售。 第一篇 理论篇 1 第1章 高性能计算概述 3 1.1 高性能计算概念辨析 3 1.1.1 并行计算、高性能计算和超级计算 3 1.1.2 超级计算机与超 级计算中心 4 1.2 计算科学 5 1.3 高性能计算发展史 5 1.4 高性能计算简介 6 1.5 向量机与阵列机 8 1.6 本章小结 9 第2章 GPU概述 10 2.1 GPU是什么 10 2.2 协处理器 10 2.3 GPU与显卡的关系 11 2.4 GPU/显卡购买注意事项 11 2.5 为什么要学GPU编程 12 2.6 GPU与CPU辨析 13 2.7 GPU发展简史 14 2.8 GPU编程方法 14 2.9 CPU/GPU异构系统 16 第3章 GPU硬件架构 17 3.1 GPU架构 17 3.1.1 Tesla架构 18 3.1.2 Fermi架构 20 3.1.3 Kepler架构 21 3.1.4 Maxwell架构 23 3.1.5 Pascal架构243.2Kernel的硬件映射 28 3.3 GPU存储体系 29 3.4 GPU计算能力 30 GPU编程与优化——大众高性能计算目录第4章GPU软件体系 33 4.1 GPU软件生态系统 33 4.2 CUDA Toolkit 34 4.2.1 NVCC编译器 34 4.2.2 cuobjdump 35 4.3 CUDA环境安装 36 4.3.1 Windows 7安装CUDA 4.2 36 4.3.2 Linux下安装CUDA 38 第5章 CUDA C编程 41 5.1 CUDA编程模型 41 5.2 CUDA编程七步曲 42 5.3 驱动API与运行时API 42 5.4 CUDA运行时函数 43 5.4.1 设备管理函数 43 5.4.2 存储管理函数 45 5.4.3 数据传输函数 48 5.4.4 线程管理函数 51 5.4.5 流管理函数 52 5.4.6 事件管理函数 52 5.4.7 纹理管理函数 53 5.4.8 执行控制函数 55 5.4.9 错误处理函数 55 5.4.10 图形学互操作函数 57 5.4.11 OpenGL互操作函数 58 5.4.12 Direct3D互操作函数 59 5.5 CUDA C语言扩展 60 5.6 gridblockthread三维模型 61 第二篇 入门篇 65 第6章 向量加法 67 6.1 向量加法及其串行代码 67 6.2 单block单thread向量加 68 6.3 单block多thread向量加 68 6.4 多block多thread向量加 69 6.5 CUBLAS库向量加法 70 6.6 实验结果分析与结论 71 6.6.1 本书实验平台 71 6.6.2 实验结果 71 6.6.3 结论 71 6.7 知识点总结 72 6.8 扩展练习 75 第7章 归约: 向量内积 76 7.1 向量内积及其串行代码 76 7.2 单block分散归约向量内积 77 7.3 单block低线程归约向量内积 78 7.4 多block向量内积(CPU二次归约) 79 7.5 多block向量内积(GPU二次归约) 81 7.6 基于原子操作的多block向量内积 81 7.7 计数法实现多block向量内积 84 7.8 CUBLAS库向量内积 85 7.9 实验结果与结论 86 7.9.1 实验结果 86 7.9.2 结论 86 7.10 归约的深入优化探讨 87 7.10.1 block数量和thread数量对归约性能的影响 87 7.10.2 算术运算优化 88 7.10.3 减少同步开销 89 7.10.4 循环展开 90 7.10.5 总结 91 7.11 知识点总结 91 7.12 扩展练习 94 第8章 矩阵乘法 95 8.1 矩阵乘法及其3种串行代码 95 8.1.1 一般矩阵乘法 95 8.1.2 循环交换矩阵乘法 97 8.1.3 转置矩阵乘法 98 8.1.4 实验结果与最优串行矩阵乘 99 8.2 grid线程循环矩阵乘法 100 8.3 block线程循环矩阵乘法 101 8.4 行共享存储矩阵乘法 101 8.5 棋盘阵列矩阵乘法 103 8.6 判断移除 105 8.7 CUBLAS矩阵乘法 106 8.8 实验结果分析与结论 108 8.8.1 矩阵乘精度分析 108 8.8.2 实验结果分析 110 8.8.3 浮点运算能力分析 111 8.9 行共享存储矩阵乘法改进 111 8.10 知识点总结 113 8.11 扩展练习 115 第9章 矩阵转置 116 9.1 矩阵转置及其串行代码 116 9.21 D矩阵转置 117 9.32 D矩阵转置 118 9.4 共享存储2D矩阵转置 119 9.5 共享存储2D矩阵转置diagonal优化 120 9.6 实验结果分析与结论 121 9.7 共享存储2D矩阵转置的深入优化 122 9.8 知识点总结 124 9.9 扩展练习 125 第三篇 提高篇 127 第10章 卷积 129 10.1 卷积及其串行实现 129 10.1.1 一维卷积 129 10.1.2 二维卷积 131 10.2 GPU上1D卷积 134 10.3 M常量1D卷积 135 10.4 M共享1D卷积 136 10.5 N共享1D卷积 137 10.6 实验结果分析 139 10.6.1 扩展法1D卷积实验结果分析 139 10.6.2 判断法与扩展法1D卷积对比 140 10.6.3 加速比分析 141 10.6.4 线程维度对性能的影响 141 10.72 D卷积的GPU移植与优化 142 10.7.1 GPU上2D卷积 142 10.7.2 M常量2D卷积 143 10.7.3 M常量N共享2D卷积 143 10.7.42 D卷积实验结果分析 145 10.8 知识点总结 145 10.9 扩展练习 147 第11章 曼德博罗特集 148 11.1 曼德博罗特集及其串行实现 148 11.2 曼德博罗特集的GPU映射 150 11.3 一些优化尝试及效果 152 11.3.1 访存连续 152 11.3.2 uchar4访存合并 153 11.3.34 种零拷贝 153 11.3.4 总结分析 155 11.4 计算通信重叠优化 156 11.5 突破kernel执行时间限制 159 11.6 知识点总结 160 11.7 扩展练习 162 第12章 扫描: 前缀求和 163 12.1 前缀求和及其串行代码 163 12.2 KoggeStone并行前缀和 164 12.2.1 直接KoggeStone分段前缀和 164 12.2.2 交错KoggeStone分段前缀和 165 12.2.3 完整KoggeStone前缀和 166 12.3 BrentKung并行前缀和 168 12.3.1 BrentKung分段前缀和 169 12.3.2 两倍数据的BrentKung分段前缀和 170 12.3.3 避免bank conflict的两倍数据BrentKung分段前缀和 171 12.3.4 完整BrentKung前缀和 173 12.4 warp分段的KoggeStone前缀求和 174 12.5 实验结果分析与结论 177 12.6 知识点总结 179 12.7 扩展练习180第13章排序 181 13.1 串行排序及其性能 181 13.1.1 选择排序 181 13.1.2 冒泡排序 182 13.1.3 快速排序 182 13.1.4 基数排序 183 13.1.5 双调排序网络 185 13.1.6 合并排序 186 13.1.7 串行排序性能对比 187 13.2 基数排序 188 13.2.1 基数排序概述 188 13.2.2 单block基数排序 189 13.2.3 基于thrust库的基数排序 196 13.3 双调排序网络 197 13.3.1 双调排序网络概述 197 13.3.2 单block双调排序网络 199 13.3.3 多block双调排序网络 202 13.4 快速排序 206 13.5 合并排序 207 13.6 实验结果分析与结论 208 13.7 知识点总结 209 13.8 扩展练习 210 第14章 几种简单图像处理 211 14.1 图像直方图统计 211 14.1.1 串行直方图统计 211 14.1.2 并行直方图统计 211 14.1.3 实验结果与分析 212 14.2 中值滤波 213 14.2.1 串行中值滤波 214 14.2.21 D并行中值滤波 215 14.2.3 共享1D中值滤波 216 14.2.4 双重共享1D中值滤波 218 14.2.52 D并行中值滤波 221 14.2.6 共享2D中值滤波 222 14.2.7 共享2D中值滤波的改进 227 14.2.8 实验结果与分析 229 14.3 均值滤波 231 14.3.1 串行均值滤波 231 14.3.2 并行均值滤波 232 14.3.3 实验结果与分析 233 第四篇 核心篇 235 第15章 GPU执行核心 237 15.1 概述 237 15.2 算术运算支持 238 15.2.1 整数运算 238 15.2.2 浮点运算 239 15.3 算术运算性能 240 15.4 分支处理 242 15.5 同步与测时 246 15.5.1 同步 246 15.5.2 测时 247 15.6 数学函数 247 15.7 warp与block原语 249 15.7.1 warp原语 249 15.7.2 block原语 250 15.8 kernel启动、线程切换和循环处理 251 第16章 GPU存储体系 254 16.1 概述 254 16.2 寄存器 259 16.3 局部存储 261 16.4 共享存储器 264 16.4.1 共享存储使用 264 16.4.2 bank conflict 265 16.4.3 volatile关键字 266 16.4.4 共享存储原子操作 267 16.5 常量存储 268 16.6 全局存储 269 16.6.1 全局存储的使用 269 16.6.2 全局存储的合并访问 271 16.6.3 利用纹理缓存通道访问全局存储 271 16.7 纹理存储 273 16.7.1 CUDA数组 273 16.7.2 纹理存储的操作和限制 274 16.7.3 读取模式、纹理坐标、滤波模式和寻址模式 276 16.7.4 表面存储 278 16.8 主机端内存 281 16.9 零拷贝操作 283 第17章 GPU关键性能测评 284 17.1 GPU性能测评概述 284 17.2 GPU参数获取 286 17.2.1 GPU选择 286 17.2.2 详细设备参数获取 287 17.3 精确测时方法汇总 288 17.3.1 clock测时 289 17.3.2 gettimeofday测时 289 17.3.3 CUDA事件测时 289 17.3.4 cutil库函数测时 290 17.4 GPU预热与启动开销 290 17.5 GPU浮点运算能力 291 17.6 GPU访存带宽 293 17.7 GPU通信带宽 295 17.8 NVIDIA Visual Profiler 296 17.9 程序性能对比约定 298 第18章 CPUs和GPUs协同 299 18.1 协同优化基点 299 18.1.1 CPU并行矩阵乘基点 299 18.1.2 GPU并行矩阵乘基点 300 18.2 CPU/GPU协同 300 18.3 多GPU协同 305 18.3.1 CUDA版本 306 18.3.2 OpenMP+CUDA 308 18.3.3 MPI+CUDA 311 18.4 CPUs/GPUs协同 314 18.4.1 CUDA版本 314 18.4.2 OpenMP+CUDA 319 18.4.3 MPI+OpenMP+CUDA 324 18.5 本章小结 329 附录 331 附录A 判断法1D卷积代码 333 附录A.1 判断法1D卷积basic版 333 附录A.2 判断法1D卷积constant版 334 附录A.3 判断法1D卷积shared版 336 附录A.4 判断法1D卷积cache版 337 附录B 曼德博罗特集的系列优化代码 340 附录B.1 完整版串行C代码 340 附录B.2 cuda_1_0 343 附录B.3 cuda_0_2 345 附录B.4 cuda_zerocopy 346 附录B.5 cuda_1_0_zerocopy 348 附录B.6 cuda_0_0_zerocopy 349 附录B.7 cuda_0_2_zerocopy 351 附录B.8 cuda_2 352 附录B.9 cuda_1_2 354 附录C 几种图像处理完整源码 357 附录C.1 BMP图像读写头文件 357 附录C.2 图像直方图串行代码 373 附录C.3 串行中值滤波代码 374 附录C.4 并行均值滤波相关代码 376 附录D nvprof帮助菜单 383 附录E NVCC帮助菜单 388 附录F 几种排序算法源代码 399 附录F.1 bitonic_sort_block函数 399 附录F.2 GPU快速排序完整代码 400 附录F.3 GPU合并排序完整代码 408 参考文献 417 级计算中心 4 1.2 计算科学 5 1.3 高性能计算发展史 5 1.4 高性能计算简介 6 1.5 向量机与阵列机 8 1.6 本章小结 9 第2章 GPU概述 10 2.1 GPU是什么 10 2.2 协处理器 10 2.3 GPU与显卡的关系 11 2.4 GPU/显卡购买注意事项 11 2.5 为什么要学GPU编程 12 2.6 GPU与CPU辨析 13 2.7 GPU发展简史 14 2.8 GPU编程方法 14 2.9 CPU/GPU异构系统 16 第3章 GPU硬件架构 17 3.1 GPU架构 17 3.1.1 Tesla架构 18 3.1.2 Fermi架构 20 3.1.3 Kepler架构 21 3.1.4 Maxwell架构 23 3.1.5 Pascal架构243.2Kernel的硬件映射 28 3.3 GPU存储体系 29 3.4 GPU计算能力 30 GPU编程与优化——大众高性能计算目录第4章GPU软件体系 33 4.1 GPU软件生态系统 33 4.2 CUDA Toolkit 34 4.2.1 NVCC编译器 34 4.2.2 cuobjdump 35 4.3 CUDA环境安装 36 4.3.1 Windows 7安装CUDA 4.2 36 4.3.2 Linux下安装CUDA 38 第5章 CUDA C编程 41 5.1 CUDA编程模型 41 5.2 CUDA编程七步曲 42 5.3 驱动API与运行时API 42 5.4 CUDA运行时函数 43 5.4.1 设备管理函数 43 5.4.2 存储管理函数 45 5.4.3 数据传输函数 48 5.4.4 线程管理函数 51 5.4.5 流管理函数 52 5.4.6 事件管理函数 52 5.4.7 纹理管理函数 53 5.4.8 执行控制函数 55 5.4.9 错误处理函数 55 5.4.10 图形学互操作函数 57 5.4.11 OpenGL互操作函数 58 5.4.12 Direct3D互操作函数 59 5.5 CUDA C语言扩展 60 5.6 gridblockthread三维模型 61 第二篇 入门篇 65 第6章 向量加法 67 6.1 向量加法及其串行代码 67 6.2 单block单thread向量加 68 6.3 单block多thread向量加 68 6.4 多block多thread向量加 69 6.5 CUBLAS库向量加法 70 6.6 实验结果分析与结论 71 6.6.1 本书实验平台 71 6.6.2 实验结果 71 6.6.3 结论 71 6.7 知识点总结 72 6.8 扩展练习 75 第7章 归约: 向量内积 76 7.1 向量内积及其串行代码 76 7.2 单block分散归约向量内积 77 7.3 单block低线程归约向量内积 78 7.4 多block向量内积(CPU二次归约) 79 7.5 多block向量内积(GPU二次归约) 81 7.6 基于原子操作的多block向量内积 81 7.7 计数法实现多block向量内积 84 7.8 CUBLAS库向量内积 85 7.9 实验结果与结论 86 7.9.1 实验结果 86 7.9.2 结论 86 7.10 归约的深入优化探讨 87 7.10.1 block数量和thread数量对归约性能的影响 87 7.10.2 算术运算优化 88 7.10.3 减少同步开销 89 7.10.4 循环展开 90 7.10.5 总结 91 7.11 知识点总结 91 7.12 扩展练习 94 第8章 矩阵乘法 95 8.1 矩阵乘法及其3种串行代码 95 8.1.1 一般矩阵乘法 95 8.1.2 循环交换矩阵乘法 97 8.1.3 转置矩阵乘法 98 8.1.4 实验结果与最优串行矩阵乘 99 8.2 grid线程循环矩阵乘法 100 8.3 block线程循环矩阵乘法 101 8.4 行共享存储矩阵乘法 101 8.5 棋盘阵列矩阵乘法 103 8.6 判断移除 105 8.7 CUBLAS矩阵乘法 106 8.8 实验结果分析与结论 108 8.8.1 矩阵乘精度分析 108 8.8.2 实验结果分析 110 8.8.3 浮点运算能力分析 111 8.9 行共享存储矩阵乘法改进 111 8.10 知识点总结 113 8.11 扩展练习 115 第9章 矩阵转置 116 9.1 矩阵转置及其串行代码 116 9.21 D矩阵转置 117 9.32 D矩阵转置 118 9.4 共享存储2D矩阵转置 119 9.5 共享存储2D矩阵转置diagonal优化 120 9.6 实验结果分析与结论 121 9.7 共享存储2D矩阵转置的深入优化 122 9.8 知识点总结 124 9.9 扩展练习 125 第三篇 提高篇 127 第10章 卷积 129 10.1 卷积及其串行实现 129 10.1.1 一维卷积 129 10.1.2 二维卷积 131 10.2 GPU上1D卷积 134 10.3 M常量1D卷积 135 10.4 M共享1D卷积 136 10.5 N共享1D卷积 137 10.6 实验结果分析 139 10.6.1 扩展法1D卷积实验结果分析 139 10.6.2 判断法与扩展法1D卷积对比 140 10.6.3 加速比分析 141 10.6.4 线程维度对性能的影响 141 10.72 D卷积的GPU移植与优化 142 10.7.1 GPU上2D卷积 142 10.7.2 M常量2D卷积 143 10.7.3 M常量N共享2D卷积 143 10.7.42 D卷积实验结果分析 145 10.8 知识点总结 145 10.9 扩展练习 147 第11章 曼德博罗特集 148 11.1 曼德博罗特集及其串行实现 148 11.2 曼德博罗特集的GPU映射 150 11.3 一些优化尝试及效果 152 11.3.1 访存连续 152 11.3.2 uchar4访存合并 153 11.3.34 种零拷贝 153 11.3.4 总结分析 155 11.4 计算通信重叠优化 156 11.5 突破kernel执行时间限制 159 11.6 知识点总结 160 11.7 扩展练习 162 第12章 扫描: 前缀求和 163 12.1 前缀求和及其串行代码 163 12.2 KoggeStone并行前缀和 164 12.2.1 直接KoggeStone分段前缀和 164 12.2.2 交错KoggeStone分段前缀和 165 12.2.3 完整KoggeStone前缀和 166 12.3 BrentKung并行前缀和 168 12.3.1 BrentKung分段前缀和 169 12.3.2 两倍数据的BrentKung分段前缀和 170 12.3.3 避免bank conflict的两倍数据BrentKung分段前缀和 171 12.3.4 完整BrentKung前缀和 173 12.4 warp分段的KoggeStone前缀求和 174 12.5 实验结果分析与结论 177 12.6 知识点总结 179 12.7 扩展练习180第13章排序 181 13.1 串行排序及其性能 181 13.1.1 选择排序 181 13.1.2 冒泡排序 182 13.1.3 快速排序 182 13.1.4 基数排序 183 13.1.5 双调排序网络 185 13.1.6 合并排序 186 13.1.7 串行排序性能对比 187 13.2 基数排序 188 13.2.1 基数排序概述 188 13.2.2 单block基数排序 189 13.2.3 基于thrust库的基数排序 196 13.3 双调排序网络 197 13.3.1 双调排序网络概述 197 13.3.2 单block双调排序网络 199 13.3.3 多block双调排序网络 202 13.4 快速排序 206 13.5 合并排序 207 13.6 实验结果分析与结论 208 13.7 知识点总结 209 13.8 扩展练习 210 第14章 几种简单图像处理 211 14.1 图像直方图统计 211 14.1.1 串行直方图统计 211 14.1.2 并行直方图统计 211 14.1.3 实验结果与分析 212 14.2 中值滤波 213 14.2.1 串行中值滤波 214 14.2.21 D并行中值滤波 215 14.2.3 共享1D中值滤波 216 14.2.4 双重共享1D中值滤波 218 14.2.52 D并行中值滤波 221 14.2.6 共享2D中值滤波 222 14.2.7 共享2D中值滤波的改进 227 14.2.8 实验结果与分析 229 14.3 均值滤波 231 14.3.1 串行均值滤波 231 14.3.2 并行均值滤波 232 14.3.3 实验结果与分析 233 第四篇 核心篇 235 第15章 GPU执行核心 237 15.1 概述 237 15.2 算术运算支持 238 15.2.1 整数运算 238 15.2.2 浮点运算 239 15.3 算术运算性能 240 15.4 分支处理 242 15.5 同步与测时 246 15.5.1 同步 246 15.5.2 测时 247 15.6 数学函数 247 15.7 warp与block原语 249 15.7.1 warp原语 249 15.7.2 block原语 250 15.8 kernel启动、线程切换和循环处理 251 第16章 GPU存储体系 254 16.1 概述 254 16.2 寄存器 259 16.3 局部存储 261 16.4 共享存储器 264 16.4.1 共享存储使用 264 16.4.2 bank conflict 265 16.4.3 volatile关键字 266 16.4.4 共享存储原子操作 267 16.5 常量存储 268 16.6 全局存储 269 16.6.1 全局存储的使用 269 16.6.2 全局存储的合并访问 271 16.6.3 利用纹理缓存通道访问全局存储 271 16.7 纹理存储 273 16.7.1 CUDA数组 273 16.7.2 纹理存储的操作和限制 274 16.7.3 读取模式、纹理坐标、滤波模式和寻址模式 276 16.7.4 表面存储 278 16.8 主机端内存 281 16.9 零拷贝操作 283 第17章 GPU关键性能测评 284 17.1 GPU性能测评概述 284 17.2 GPU参数获取 286 17.2.1 GPU选择 286 17.2.2 详细设备参数获取 287 17.3 精确测时方法汇总 288 17.3.1 clock测时 289 17.3.2 gettimeofday测时 289 17.3.3 CUDA事件测时 289 17.3.4 cutil库函数测时 290 17.4 GPU预热与启动开销 290 17.5 GPU浮点运算能力 291 17.6 GPU访存带宽 293 17.7 GPU通信带宽 295 17.8 NVIDIA Visual Profiler 296 17.9 程序性能对比约定 298 第18章 CPUs和GPUs协同 299 18.1 协同优化基点 299 18.1.1 CPU并行矩阵乘基点 299 18.1.2 GPU并行矩阵乘基点 300 18.2 CPU/GPU协同 300 18.3 多GPU协同 305 18.3.1 CUDA版本 306 18.3.2 OpenMP+CUDA 308 18.3.3 MPI+CUDA 311 18.4 CPUs/GPUs协同 314 18.4.1 CUDA版本 314 18.4.2 OpenMP+CUDA 319 18.4.3 MPI+OpenMP+CUDA 324 18.5 本章小结 329 附录 331 附录A 判断法1D卷积代码 333 附录A.1 判断法1D卷积basic版 333 附录A.2 判断法1D卷积constant版 334 附录A.3 判断法1D卷积shared版 336 附录A.4 判断法1D卷积cache版 337 附录B 曼德博罗特集的系列优化代码 340 附录B.1 完整版串行C代码 340 附录B.2 cuda_1_0 343 附录B.3 cuda_0_2 345 附录B.4 cuda_zerocopy 346 附录B.5 cuda_1_0_zerocopy 348 附录B.6 cuda_0_0_zerocopy 349 附录B.7 cuda_0_2_zerocopy 351 附录B.8 cuda_2 352 附录B.9 cuda_1_2 354 附录C 几种图像处理完整源码 357 附录C.1 BMP图像读写头文件 357 附录C.2 图像直方图串行代码 373 附录C.3 串行中值滤波代码 374 附录C.4 并行均值滤波相关代码 376 附录D nvprof帮助菜单 383 附录E NVCC帮助菜单 388 附录F 几种排序算法源代码 399 附录F.1 bitonic_sort_block函数 399 附录F.2 GPU快速排序完整代码 400 附录F.3 GPU合并排序完整代码 408 参考文献 417
用户评论
GPU编程与优化:大众高性能计算