第1篇 并行简介 3
第1章 并行现状 3
1.1并行时代的到来 3
1.1.1功率密度的飙升 3
1.1.2多核和众核计算的出现 4
1.2六大挑战 5
1.2.1遗留代码 6
1.2.2工具 6
1.2.3教育培训 6
1.2.4众核计算的顾虑 7
1.2.5可维护性 7
1.2.6投入产出 7
1.3并行与编程者 7
1.3.1并行的类型 8
1.3.2 Intel的并行模型 8
1.3.3选择正确的并行构造 10
1.3.4并行编程错误 13
1.3.5加速比和可扩展性 16
1.3.6并行与实时系统 19
1.4小结 20
第2章 Parallel Studio XE概览 21
2.1 Parallel Studio XE的优势 21
2.2 Parallel Studio XE组成 21
2.3 Intel Parallel Studio XE 22
2.4 Intel Parallel Advisor 23
2.4.1 Advisor工作流程 23
2.5 Intel Parallel Composer XE 26
2.5.1 Intel C/C++++优化编译器 26
2.5.2 OpenMP 31
2.5.3 Intel的线程构造块 32
2.5.4 Intel的集成性能原语 33
2.5.5 Intel的Parallel Debugger Extension 35
2.5.6 Intel Debugger 36
2.5.7数学核心库MKL 36
2.6 VTune Amplifiier XE 38
2.6.1热点分析 38
2.6.2并发性分析 39
2.6.3锁和空闲分析 39
2.6.4反汇编源码视图 40
2.7 Parallel Inspector XE 40
2.7.1预定义分析类型 40
2.7.2错误与警告 41
2.8静态安全性分析 42
2.9各种使用Parallel Studio XE的方法 43
2.10小结 43
第3章 Parallel Studio XE快速上手 44
3.1四步骤方法 44
3.2例子1:使用Cilk Plus 45
3.2.1找一个合适的串行程序 45
3.2.2运行串行程序 47
3.2.3步骤1:分析串行程序 49
3.2.4步骤2:用Cilk Plus实现并行性 52
3.2.5步骤3:调试及错误检查 53
3.2.6步骤4:对Cilk Plus程序调优 59
3.3例子2:使用OpenMP 61
3.3.1步骤1:分析串行程序 61
3.3.2步骤2:使用OpenMP实现并行性 62
3.3.3步骤3:调试与错误检查 63
3.3.4步骤4: OpenMP程序的调优 64
3.4小结 71
第2篇 Parallel Studio XE教程 75
第4章 生成优质的代码 75
4.1引言 75
4.2应用程序样例 76
4.3代码优化的七步骤 77
4.3.1使用编译器的报告 77
4.3.2步骤1:不使用优化技术构建应用程序 78
4.3.3步骤2:使用通用优化 80
4.3.4步骤3:使用处理器相关的优化 83
4.3.5步骤4:增加过程间优化 93
4.3.6步骤5:性能测评指导的优化 96
4.3.7步骤6:自动向量化的调优 100
4.4更多关于自动向量化的内容 102
4.4.1构建可以在多种CPU上运行的应用程序 102
4.4.2其他插入向量化的方法 103
4.5源代码 108
4.6小结 113
第5章 编写安全的代码 114
5.1一个简单的安全缺陷例子 114
5.2了解静态安全分析 117
5.2.1虚警 118
5.2.2静态安全分析流程 118
5.2.3实施一次静态安全分析 119
5.3构建的明细 126
5.3.1用注入方式创建构建明细文件 126
5.4在QA环境中使用静态安全分析 129
5.4.1回归测试 130
5.4.2度量跟踪 130
5.5源代码 132
5.6小结 134
第6章 在何处并行化 135
6.1性能测评的不同方法 135
6.2示例应用程序 136
6.3使用Intel编译器进行热点分析 138
6.3.1性能测评步骤 138
6.3.2一个具体的例子 139
6.3.3性能测评引起的开销 142
6.4使用auto-parallelizer进行热点分析 143
6.4.1测评步骤 143
6.4.2一个具体的例子 144
6.4.3自动并行化编程指南 146
6.5使用Amplifiier XE进行热点分析 149
6.5.1进行默认分析 149
6.5.2找到适合并行化的循环 149
6.5.3大型或运行时间长的应用程序 151
6.6源代码 153
6.7小结 157
第7章 实现并行化 158
7.1 C还是C+++,这是个问题 159
7.2一个简单的方法 159
7.3 lambda函数之美 160
7.4循环并行化 161
7.4.1 for循环 161
7.4.2嵌套for循环 164
7.4.3归约for循环 166
7.4.4 while循环 167
7.5代码段和函数并行化 169
7.5.1串行版本 170
7.5.2 Cilk Plus 171
7.5.3 OpenMP 172
7.5.4 TBB 173
7.6递归函数并行化 173
7.6.1串行版本 174
7.6.2 Cilk Plus 175
7.6.3 OpenMP 175
7.6.4 TBB 176
7.7流水应用程序并行化 177
7.7.1并行流水模式 177
7.7.2串行版本 179
7.7.3 OpenMP 180
7.7.4 TBB 181
7.8链表并行化 183
7.8.1链表的串行遍历 184
7.8.2链表的并行遍历 184
7.9源代码 186
7.10小结 190
第8章 检查错误 191
8.1 Parallel Inspector XE分析的类型 191
8.2检测线程错误 192
8.2.1线程问题的类型 193
8.2.2一个包含死锁的例子 193
8.3检测死锁 194
8.4检测数据竞争 197
8.4.1运行线程化的程序 197
8.4.2第一次分析结果 198
8.4.3控制报告的详细程度 200
8.5消除数据竞争 205
8.5.1使用Cilk Plus 205
8.5.2使用OpenMP 208
8.5.3使用TBB 208
8.6检测内存错误 210
8.6.1内存错误的类型 210
8.6.2一个内存分析的例子 211
8.7创建自定义分析 216
8.8源代码 217
8.9小结 220
第9章 并行程序的调优 222
9.1简介 222
9.2定义基准 223
9.2.1确保一致性 223
9.2.2度量性能的提升 223
9.2.3使用Amplifiier XE命令行测出基准 223
9.3识别并发热点 225
9.3.1线程的并发度和CPU使用率 225
9.3.2识别代码中的热点 226
9.4分析时间轴 228
9.4.1问题回答 228
9.4.2修复临界区热点 229
9.5分析算法 231
9.6进一步分析和调优 233
9.6.1使用其他视图 236
9.6.2使用锁和等待分析 237
9.6.3其他分析类型 238
9.7使用Intel Software Autotuning Tool 239
9.8源代码 240
9.9小结 243
第10章 Parallel Advisor设计指导 244
10.1使用Parallel Advisor 244
10.1.1理解Advisor的工作流程 245
10.1.2寻找文档 246
10.1.3从NQueens例子程序开始 246
10.2位置审查 248
10.2.1运行审查分析 248
10.2.2位置审查分析是如何工作的 251
10.3标注代码 252
10.3.1部位(Site)的标注 252
10.3.2锁的标注 254
10.3.3添加标注 254
10.4检测合适度 256
10.4.1执行合适度分析 257
10.4.2合适度分析是如何工作的 260
10.5检查正确性 261
10.5.1运行正确性分析 261
10.5.2正确性分析的局限性 267
10.5.3正确性分析是如何工作的 267
10.6替换标注 269
10.6.1 Summary Report 270
10.6.2普通的映射方法 270
10.7小结 273
第11章 并行程序的调试 274
11.1 Intel Debugger简介 274
11.2使用Intel调试器来检测数据竞争 276
11.2.1编译串行程序 276
11.2.2添加并行化 277
11.2.3观察结果 279
11.2.4检测数据竞争 280
11.2.5修复数据竞争 287
11.3关于过滤器的更多内容 294
11.4运行时检查:查看应用程序状态 295
11.4.1使用OpenMP任务窗口来检查一个并行域的变量 296
11.4.2使用OpenMP生成树窗口来查看并行代码的行为 297
11.5小结 300
第12章 基于事件的VTune Amplifiier XE分析 301
12.1测试一个应用的健壮性 301
12.1.1导致高CPI的原因 302
12.1.2只用CPI就足够测量健壮性吗 302
12.1.3进行全系统的分析 303
12.2进行一次热点分析 304
12.2.1热点分析类型 305
12.3进行一次General Exploration分析 310
12.3.1快速注解栏 312
12.4修复硬件问题 314
12.4.1减少缓存未命中 315
12.4.2使用更多高效指令 317
12.4.3使用Intel编译器 318
12.5使用Amplifiier XE的其他工具 319
12.5.1使用预定义分析类型 320
12.5.2使用视图 320
12.5.3使用API 321
12.6应用程序实例 325
12.7小结 329
第3篇 案例分析 333
第13章 世界上第一个数独“Thirty-Niner” 333
13.1挑战数独优化 333
13.1.1所面临挑战的性质 334
13.1.2顶层设计 334
13.1.3使用SSE内置函数优化求解器 335
13.1.4对生成器进行并行化 337
13.1.5结果 338
13.2动手实例:优化数独生成器 339
13.2.1关于代码 339
13.2.2求解器 340
13.2.3生成器 344
13.3小结 350
第14章 通往并行编程殿堂的九条建议 351
14.1挑战:模拟恒星形成 351
14.1.1恒星的形成 352
14.2动手练习 352
14.2.1性能调优 353
14.3应用程序的启发性 353
14.3.1查找热点 354
14.3.2使用一个基于树的N-物体模拟 356
14.3.3使用哈希八叉树 358
14.4架构调优 359
14.5添加并行化 362
14.5.1识别出热点和找出调用顺序 362
14.5.2实现并行化 363
14.5.3检测数据竞争和其他潜在的问题 364
14.5.4负载均衡 365
14.5.5执行结果 366
14.6小结 367
第15章CERN对撞机的并行轨迹拟合 368
15.1学习案例 368
15.2一个高能物理实验的过程 368
15.2.1轨迹重构阶段 369
15.3什么是ArBB 374
15.4并行化轨迹拟合代码 376
15.4.1添加数组构建块到已存的代码之中 376
15.4.2代码重构 377
15.4.3结果 380
15.5动手练习项目 385
15.5.1练习 385
15.5.2项目 385
15.5.3编译并运行串行版本 385
15.5.4并行化轨迹拟合代码 389
15.6小结 405
第16章 遗留代码的并行化 406
16.1 Dhrystone基准简介 406
16.1.1代码的结构 407
16.1.2全局和共享变量 407
16.2动手练习项目 408
16.2.1编译项目 408
16.2.2在Dhrystone循环中增加Amplifiier XE API来增加时间戳 410
16.2.3查看结果 411
16.3并行化基准的C版本 414
16.3.1方式一:同步共享变量的访问 414
16.3.2方式二:复制全局变量 417
16.4并行化C+++版本的基准 420
16.4.1方式三:将应用程序封装到一个C++++类中 420
16.4.2方式四:使用Cilk Plus Holder 424
16.5结果总览 428
16.5.1性能 428
16.5.2修改工作 428
16.6小结 429