第1章 CUDA入门与编程思想 1
1.1 源代码与维基 1
1.2 一个用以区别CUDA与传统程序开发的示例 2
1.3 选择合适的CUDA API 5
1.4 CUDA的一些基本概念 7
1.5 理解首个Runtime Kernel 10
1.6 GPGPU编程的三条法则 11
1.6.1 法则1:将数据放入并始终存储于GPU 12
1.6.2 法则2:交给GPGPU足够多的任务 12
1.6.3 法则3:注重GPGPU上的数据重用,以避免带宽限制 12
1.7 大O记号的思想与数据传输 13
1.8 CUDA和Amdahl定律 15
1.9 数据并行与任务并行 15
1.10 混合执行:同时使用CPU和GPU资源 16
1.11 回归测试与正确性 18
1.12 静默错误 19
1.13 调试简介 20
1.14 UNIX调试方法 21
1.14.1 NVIDIA cuda-gdb调试器 21
1.14.2 CUDA内存检查器 23
1.14.3 通过UNIX ddd界面使用cuda-gdb 24
1.15 使用Parallel Nsight进行Windows调试 25
1.16 本章小结 27
第2章 CUDA在机器学习与优化中的应用 28
2.1 建模与模拟 28
2.1.1 拟合参数化模型 29
2.1.2 Nelder-Mead方法 30
2.1.3 Levenberg-Marquardt方法 30
2.1.4 算法加速 31
2.2 机器学习与神经网络 32
2.3 异或逻辑:一个重要的非线性机器学习问题 33
2.3.1 目标函数示例 35
2.3.2 针对多GPU设备、多CPU处理器的完整仿函数 35
2.3.3 完整Nelder-Mead优化代码的简要讨论 37
2.4 异或逻辑的性能结果 45
2.5 性能讨论 45
2.6 本章小结 48
2.7 C++NELDER-MEAD代码模板 48
第3章 CUDA工具套件:对PCA、NLPCA进行性能分析 53
3.1 PCA和NLPCA 53
3.1.1 自编码网络 55
3.1.2 用于PCA分析的仿函数示例 56
3.1.3 用于NLPCA分析的示例仿函数 58
3.2 获得基础性能分析数据 60
3.3 gprof:通用UNIX性能分析器 61
3.4 NVIDIA可视化性能分析器:computeprof 62
3.5 Microsoft Visual Studio中的Parallel Nsight 65
3.5.1 Nsight时间表分析 66
3.5.2 NVTX跟踪支持库 67
3.5.3 CUDA API的可扩展性表现 68
3.6 性能调节与分析实用工具(TAU) 70
3.7 本章小结 70
第4章 CUDA执行模型 72
4.1 GPU架构综述 72
4.1.1 线程调度:通过执行配置统筹性能与并行度 74
4.1.2 eomputeprof中Warp相关值 77
4.1.3 Warp分歧 77
4.1.4 关于Warp分歧的若干准则 78
4.1.5 computeprof中Warp分歧相关值 79
4.2 Warp调度与TLP 79
4.3 ILP:高性能低占用率 80
4.3.1 ILP隐藏算术计算延迟 81
4.3.2 ILP隐藏数据延迟 84
4.3.3 ILP的未来 84
4.3.4 computeprof中指令速率相关值 85
4.4 Little法则 86
4.5 检测限制因素的CUDA工具 87
4.5.1 nvcc编译器 88
4.5.2 启动约束 90
4.5.3 反汇编器 90
4.5.4 PTX Kernel函数 92
4.5.5 GPU模拟器 92
4.6 本章小结 93
第5章 CUDA存储器 94
5.1 CUDA存储器层次结构 94
5.2 GPU存储器 95
5.3 L2缓存 98
5.4 L1缓存 99
5.5 CUDA内存类型 100
5.5.1 寄存器 101
5.5.2 局域内存 101
5.5.3 和局域内存相关的computeprof性能分析参数 102
5.5.4 共享内存 102
5.5.5 和共享内存相关的computeprof性能分析参数 105
5.5.6 常量内存 105
5.5.7 纹理内存 106
5.5.8 和纹理内存相关的computeprof性能分析参数 108
5.6 全局内存 109
5.6.1 常见的整合内存示例 110
5.6.2 全局内存的申请 111
5.6.3 全局内存设计中的限制因素 113
5.6.4 和全局内存相关的computeprof性能分析参数 114
5.7 本章小结 115
第6章 高效使用CUDA存储器 116
6.1 归约 116
6.1.1 归约模板 117
6.1.2 functionReduce.h的测试程序 122
6.1.3 测试结果 126
6.2 使用非规则数据结构 127
6.3 稀疏矩阵和CUSP支持库 131
6.4 图论算法 132
6.5 SoA、AoS以及其他数据结构 134
6.6 分片和分块 135
6.7 本章小结 136
第7章 提高并行度的技巧 137
7.1 CUDA上下文环境对并行度的扩展 137
7.2 流与上下文环境 138
7.2.1 多GPU的使用 139
7.2.2 显式同步 139
7.2.3 隐式同步 141
7.2.4 统一虚拟地址空间 141
7.2.5 一个简单的示例 142
7.2.6 分析结果 144
7.3 使用多个流乱序执行 144
7.3.1 在同一GPU内并发执行Kernel函数的建议 147
7.3.2 隐式并行Kernel的原子操作 147
7.4 将数据捆绑计算 149
7.4.1 手动分割数据 150
7.4.2 映射内存 150
7.4.3 映射内存的工作机制 152
7.5 本章小结 153
第8章 CUDA在所有GPU与CPU程序中的应用 154
8.1 从CUDA到多种硬件后端的途径 155
8.1.1 PGI CUDA x86编译器 155
8.1.2 PGI CUDA x86编译器 157
8.1.3 将x86处理器核心用作流多处理器 159
8.1.4 NVIDIA NVCC编译器 160
8.1.5 Ocelot 160
8.1.6 Swan 161
8.1.7 MCUDA 162
8.2 从其他语言访问CUDA 162
8.2.1 SWIG 162
8.2.2 Copperhead 163
8.2.3 EXCEL 164
8.2.4 MATLAB 164
8.3 支持库 164
8.3.1 CUBLAS 164
8.3.2 CUFFT 165
8.3.3 MAGMA 174
8.3.4 phiGEMM支持库 175
8.3.5 CURAND 176
8.4 本章小结 177
第9章 CUDA与图形渲染混合编程 178
9.1 OpenGL 178
9.1.1 GLUT 179
9.1.2 通过OpenGL映射GPU内存 179
9.1.3 使用基元重启提升3D处理性能 181
9.2 框架内各文件的介绍 183
9.2.1 Kernel与perlin Kernel演示的示例代码 184
9.2.2 simpleGLmain.cpp文件 192
9.2.3 simpleVBO.cpp文件 196
9.2.4 callbacksVBO.cpp文件 199
9.3 本章小结 204
第10章 在云计算和集群环境中使用CUDA 205
10.1 消息传递接口 205
10.1.1 MPI编程模型 206
10.1.2 MPI通信器 206
10.1.3 MPI进程号 206
10.1.4 主从模式 208
10.1.5 点对点模式基础 208
10.2 MPI通信机制 209
10.3 带宽 211
10.4 平衡率 212
10.5 运行大型MPI程序需要考虑的因素 214
10.5.1 初始数据加载的可扩展性 214
10.5.2 使用MPI进行计算 215
10.5.3 可扩展性检查 216
10.6 云计算 217
10.7 代码示例 218
10.7.1 数据的产生 218
10.7.2 主体代码部分 220
10.8 本章小结 225
第11章 CUDA在现实问题中的应用 227
11.1 高维数据的处理 228
11.1.1 PCA/NLPCA 228
11.1.2 多维尺度分析 229
11.1.3 K均值聚类算法 229
11.1.4 期望最大化 229
11.1.5 支持向量机 230
11.1.6 Bayesian网络 230
11.1.7 互信息 231
11.2 力导向图 232
11.3 Monte Carlo方法 232
11.4 分子建模 233
11.5 量子化学 234
11.6 交互式工作流 234
11.7 其他众多的项目 235
11.8 本章小结 235
第12章 针对现场实况视频流的应用程序 236
12.1 机器视觉话题 236
12.1.1 3D效果 237
12.1.2 肤色区域分割 238
12.1.3 边缘检测 238
12.2 FFmpeg 239
12.3 TCP服务器 241
12.4 实况视频流应用程序 244
12.4.1 kernelWave():动画Kernel函数 244
12.4.2 kernelFlat():在平面渲染图像 245
12.4.3 kernelSkin():仅保留肤色区域 245
12.4.4 kernelSobel():Sobel边缘检测过滤器 246
12.4.5 launch_kernel()方法 247
12.5 simpleVBO.cpp文件 248
12.6 callbacksVBO.cpp文件 248
12.7 生成与执行代码 251
12.8 展望 251
12.8.1 机器学习 252
12.8.2 Connectome 252
12.9 本章小结 253
12.10 simpleVBO.cpp文件 253
参考文献 258
术语表 265