第1章 从串行编程到并行编程 1
1.1 简单的数据并行循环 1
1.1.1 OpenACC内核构件与并行构件对比 4
1.1.2 OpenACC并行的多种形式 6
1.1.3 accFill_ex2运行时结果 7
1.2 简单的任务并行示例 8
1.3 Amdahl定律及其扩展 9
1.3.1 大O表示法和数据传输 11
1.3.2 accTask.cpp代码的扩展性 12
1.4 并行执行和竞争条件 14
1.5 无锁编程 17
1.6 控制并行资源 20
1.7 让生活更简单 22
1.8 参考文献 23
第2章 性能导向开发 24
2.1 测试代码:共轭梯度法 25
2.1.1 代码编译 25
2.1.2 初始测试 26
2.2 描述并行度 28
2.2.1 加速waxpby 28
2.2.2 加速dot 31
2.2.3 加速matvec 32
2.3 描述数据移动 34
2.4 优化循环 39
2.4.1 缩短向量长度 40
2.4.2 增加并行度 41
2.5 在多核系统中并行运行 43
2.6 小结 44
第3章 使用Score-P和Vampir分析混合应用性能 46
3.1 性能分析技术和术语 47
3.2 逐步性能提升 48
3.3 激光驱动电子束的粒子单元模拟 48
3.4 通过代码插装准备性能测量 49
3.5 在应用程序执行期间记录性能信息 50
3.6 第一个并行PIConGPU实现 51
3.7 释放主机进程 53
3.8 优化GPU内核 53
3.9 增加GPU任务并行 54
3.10 使用Score-P和Vampir记录OpenACC运行时事件 55
3.11 小结 56
3.12 参考文献 56
第4章 数据传输流水线化 58
4.1 初识流水线 59
4.2 示例代码:曼德勃罗发生器 59
4.2.1 分块计算 62
4.2.2 分块数据拷贝 63
4.2.3 异步执行 63
4.3 在多种设备上实现流水线 65
4.4 结论 69
第5章 高级数据管理 70
5.1 非结构化数据区域 71
5.2 动态数据成员的聚合类型 73
5.3 C++类数据管理 75
5.3.1 创建通用列表容器类 77
5.3.2 accList更新方法 79
5.4 在例程中使用全局和模块变量 80
5.5 仅在设备端可用的数据 82
5.5.1 映射设备端数据 83
5.5.2 MPI进程间共享设备端数据 84
5.6 示例代码 86
5.7 运行时结果 91
5.8 小结 93
第6章 循环执行调优 94
6.1 loop构件 95
6.2 基本loop优化子句 97
6.2.1 auto子句 97
6.2.2 independent子句 98
6.2.3 seq子句 98
6.2.4 reduction子句 99
6.2.5 collapse子句 101
6.3 高级loop优化子句 102
6.3.1 gang、worker和vector子句 102
6.3.2 tile子句 102
6.4 性能测试结果 104
6.5 小结 105
第7章 多设备编程 106
7.1 简介 106
7.2 三种多设备编程方法 107
7.2.1 处理设备相关性和选择设备 107
7.2.2 单线程多设备编程 108
7.2.3 多线程多设备编程 108
7.2.4 多进程多设备编程 109
7.3 示例:2D泊松方程的雅可比求解器 109
7.4 域分解 111
7.4.1 单线程多设备编程 111
7.4.2 多线程多设备编程 114
7.4.3 多进程多设备编程 116
7.4.4 通信与计算重叠 120
7.5 调试和分析 122
7.5.1 使用cuda-memcheck和cuda-gdb调试 122
7.5.2 使用nvprof和NVIDIA Visual Profiler分析 123
7.6 小结 123
7.7 参考文献 124
第8章 Stencil和Feldkamp算法移植 125
8.1 简介 125
8.2 实验环境 126
8.2.1 Feldkamp-Davis-Kress算法 126
8.2.2 2D热方程 133
8.3 OpenMP/OpenACC混合编程 138
8.4 小结 141
8.5 参考文献 142
第9章 加速3D波方程 143
9.1 简介 143
9.2 示例代码:计算3D标量波方程 144
9.3 栈变成堆 146
9.4 测量主机基准扩展性 148
9.4.1 创建OpenMP编译环境 148
9.4.2 编译OpenMP代码 149
9.4.3 运行OpenMP代码 150
9.5 使用OpenACC工具 150
9.5.1 添加OpenACC并行指令 150
9.5.2 编译OpenACC并行指令 151
9.5.3 理解统一内存 151
9.5.4 使用统一内存 152
9.5.5 运行统一内存 152
9.5.6 使用可视化分析器分析统一内存 153
9.6 使用OpenACC数据指令 155
9.6.1 编译OpenACC数据指令 156
9.6.2 分析OpenACC数据指令 156
9.6.3 运行OpenACC数据指令 158
9.7 OpenACC多核系统 158
9.7.1 编译OpenACC多核 159
9.7.2 在多核系统上运行OpenACC 160
9.8 小结 160
9.9 参考文献 161
第10章 应用程序开发详解 162
10.1 CloverLeaf简介 162
10.1.1 流体力学方案 162
10.1.2 测试用例 163
10.2 开发平台:Cray XK6 163
10.3 开发OpenACC版本CloverLeaf 164
10.3.1 热点 164
10.3.2 独立内核加速 165
10.3.3 多个内核加速 166
10.3.4 GPU上实现完全驻留 167
10.3.5 增加问题规模 167
10.3.6 与混合MPI/OpenMP比较 169
10.3.7 混合MPI/OpenACC 169
10.3.8 版本A:初始性能 169
10.3.9 版本B:内循环依赖 170
10.3.10 版本C:嵌套循环和全局变量 173
10.3.11 版本D:多GPU,减少隐式传输 174
10.3.12 版本E:OpenACC同步等待 175
10.3.13 GPU优化对CPU的影响 178
10.3.14 多GPU扩展 179
10.4 结论 180
10.4.1 CPU上的OpenACC实现 180
10.4.2 异构计算 182
10.5 小结 183
10.6 扩展信息 184
第11章 GPU加速分子动力学聚类分析 185
11.1 简介 185
11.2 MD聚类分析概述 186
11.2.1 聚类算法 187
11.2.2 QCP快速计算成对RMSD 188
11.2.3 原子选择和轨迹数据结构 189
11.2.4 不相似矩阵计算 190
11.3 硬件架构注意事项 191
11.4 实现 192
11.4.1 性能评估测试用例 192
11.4.2 存储器布局优化 192
11.4.3 QCP内积循环 192
11.4.4 手写向量化QCP内积循环 194
11.4.5 代码适配和使用OpenACC指令 196
11.5 性能测试结果 200
11.6 小结 202
11.7 致谢 203
11.8 参考文献 203
第12章 增量式加速RI-MP2电子结构理论的相关方法 206
12.1 简介 206
12.2 原理 208
12.3 实现 209
12.3.1 GPU-1 209
12.3.2 GPU-2 210
12.3.3 GPU-3 211
12.3.4 GPU-4 212
12.3.5 GPU-5 213
12.3.6 GPU-6 214
12.3.7 GPU-7 215
12.3.8 GPU-8 216
12.4 结果 217
12.4.1 计算细节 217
12.4.2 问题规模扩展 218
12.4.3 设备数量扩展 219
12.4.4 总性能 220
12.5 小结 222
12.6 致谢 223
12.7 参考文献 223
第13章 将大型传统气候和天气建模代码移植到GPU上 226
13.1 简介 226
13.2 移植方法:步骤详解 228
13.2.1 简化大气模型 228
13.2.2 步骤1:添加并行区域 229
13.2.3 步骤2:管理数据传输 231
13.2.4 步骤3:基本优化 233
13.2.5 并行循环包含子例程调用 235
13.2.6 CUDA接口 237
13.3 性能优化 239
13.4 辐射参数化的结果 241
13.5 参考文献 243