译者序
序言
前言
第1章 CUDA入门与编程思想1
1.1 源代码与维基1
1.2 一个用以区别CUDA与传统程序开发的示例2
1.3 选择合适的CUDA API5
1.4 CUDA的一些基本概念7
1.5 理解首个Runtime Kernel10
1.6 GPGPU编程的三条法则11
1.6.1 法则1:将数据放入并始终存储于GPU12
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-gdb24
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和NLPCA53
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可视化性能分析器:computeprof62
3.5 Microsoft Visual Studio中的Parallel Nsight65
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 computeprof中Warp相关值77
4.1.3 Warp分歧77
4.1.4 关于Warp分歧的若干准则78
4.1.5 computeprof中Warp分歧相关值79
4.2 Warp调度与TLP79
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 Ocelot160
8.1.6 Swan161
8.1.7 MCUDA162
8.2 从其他语言访问CUDA162
8.2.1 SWIG162
8.2.2 Copperhead163
8.2.3 EXCEL164
8.2.4 MATLAB164
8.3 支持库164
8.3.1 CUBLAS164
8.3.2 CUFFT165
8.3.3 MAGMA174
8.3.4 phiGEMM支持库175
8.3.5 CURAND176
8.4 本章小结177
第9章 CUDA与图形渲染混合编程178
9.1 OpenGL178
9.1.1 GLUT179
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章 在云计算和集群环境中使用CUDA205
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/NLPCA228
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 FFmpeg239
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 Connectome252
12.9 本章小结253
12.10 simpleVBO.cpp文件253
参考文献258
术语表265
· · · · · · (
收起)