《GPU编程与优化 大众高性能计算》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:方民权著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2016
  • ISBN:9787302446422
  • 页数:417 页
图书介绍:本书第一篇章系统地介绍了GPU编程的相关知识,能够帮助读者更快入门,并构建领域知识框架;第二篇章和第三篇章循序渐进地介绍大量实例,每个实例采用类似科技论文的描述方法,能为读者提供系统的GPU编程和优化参考;第四篇章总结了影响GPU性能的关键知识要点,量化测评了GPU的核心性能参数,能够帮助读者深入理解GPU体系结构,学会GPU优化。

第一篇 理论篇 3

第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架构 24

3.2 Kernel的硬件映射 28

3.3 GPU存储体系 29

3.4 GPU计算能力 30

第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 grid-block-thread三维模型 61

第二篇 入门篇 67

第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.2 1D矩阵转置 117

9.3 2D矩阵转置 118

9.4 共享存储2D矩阵转置 119

9.5 共享存储2D矩阵转置diagonal优化 120

9.6 实验结果分析与结论 121

9.7 共享存储2D矩阵转置的深入优化 122

9.8 知识点总结 124

9.9 扩展练习 125

第三篇 提高篇 129

第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.7 2D卷积的GPU移植与优化 142

10.7.1 GPU上2D卷积 142

10.7.2 M常量2D卷积 143

10.7.3 M常量N共享2D卷积 143

10.7.4 2D卷积实验结果分析 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.3 4种零拷贝 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 Kogge-Stone并行前缀和 164

12.2.1 直接Kogge-Stone分段前缀和 164

12.2.2 交错Kogge-Stone分段前缀和 165

12.2.3 完整Kogge-Stone前缀和 166

12.3 Brent-Kung并行前缀和 168

12.3.1 Brent-Kung分段前缀和 169

12.3.2 两倍数据的Brent-Kung分段前缀和 170

12.3.3 避免bank conflict的两倍数据Brent-Kung分段前缀和 171

12.3.4 完整Brent-Kung前缀和 173

12.4 warp分段的Kogge-Stone前缀求和 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.2 1D并行中值滤波 215

14.2.3 共享1D中值滤波 216

14.2.4 双重共享1D中值滤波 218

14.2.5 2D并行中值滤波 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

第四篇 核心篇 237

第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

附录 333

附录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