第1章 绪论 1
1.1更加并行化 1
1.2为什么需要Intel Xeon Phi协处理器 2
1.3协处理器平台 5
1.4第一款Intel Xeon Phi协处理器 7
1.5控制“Ninja鸿沟”于一定范围 9
1.6移植与优化的双重优势 9
1.7何时使用Intel Xeon Phi协处理器 10
1.8实现处理器性能最优 11
1.9为何扩展超过100个线程如此重要 11
1.10最大化并行程序性能 14
1.11评估高度并行执行的能力 14
1.12对于GPU是怎么样的 15
1.13易于移植,也易于提升性能 16
1.14性能移植 16
1.15 超线程与多线程 17
1.16协处理器主要使用模型:MPI和Offload 17
1.17编译器和编程模型 18
1.18缓存优化 19
1.19案例和细节 20
1.20更多信息 21
第2章 高性能封闭追踪测试驱动 23
2.1揭开引擎盖:协处理器详解 24
2.2发动汽车:与协处理器沟通 25
2.3轻松上路:首次运行代码 27
2.4开始加速:多线程运行代码 31
2.5全速行驶:使用所有核心 36
2.6轻松过弯:访存带宽 45
2.7高速漂移:内存带宽最大化 50
2.8总结 52
第3章 一场乡间公路友谊赛 55
3.1赛前准备:本章重点 55
3.2初识赛道:9点模板算法 56
3.3起跑线上:9点模板基准程序 58
3.4路在前方:运行基准模板代码 63
3.5石子路上:向量化而未扩展 65
3.6全力比赛:向量化加上规模扩展 67
3.7扳手和润滑油:代码微调 70
3.7.1基准校正 70
3.7.2使用流存储 72
3.7.3使用2MB大型存储页 73
3.8总结 74
3.9更多信息 75
第4章 都市畅游:实际代码优化案例 77
4.1选择方向:基本的扩散算法 78
4.2到达路口:计算边界效应 78
4.3寻找林荫大道:代码扩展化 84
4.4雷霆之路:保证向量化 86
4.5剥离:从最内层循环开始 89
4.6尝试辛烷含量更高的燃料:利用数据局部性与切片分块提升速度 92
4.7高速驾驶认证:高速旅行的总结 96
第5章 大数据(向量) 99
5.1为什么向量化 99
5.2如何向量化 100
5.3实现向量化的五种方法 100
5.4六步向量化方法论 102
5.5通过Cache流:布局、对齐、预取数据 104
5.5.1为什么数据布局影响向量化性能 104
5.5.2数据校准 106
5.5.3预取 107
5.5.4流存储 112
5.6编译器技巧 114
5.6.1避免手动展开循环 114
5.6.2循环向量化的要求(英特尔编译器) 115
5.6.3内联的重要性,简单性能分析的干扰 116
5.7编译器选项 117
5.8编译器指导指令 118
5.8.1 SIMD指令 119
5.8.2 VECTOR与NOVECTOR指令 123
5.8.3 IVDEP指令 124
5.8.4随机数函数向量化 126
5.8.5充分向量化 128
5.8.6 -opt-assume-safe-padding选项 130
5.8.7数据对齐 130
5.8.8在数组表示法(Array Notation)中权衡向量长度 134
5.9使用数组段(Array Section)支持向量化 137
5.9.1 Fortran数组段 137
5.9.2 Cilk Plus数组段和元素函数 139
5.10查看编译器生成:汇编代码检测 143
5.10.1如何找到汇编代码 143
5.10.2快速查看汇编代码 145
5.11向量化数值结果差异 149
5.12总结 149
5.13更多信息 149
第6章 多任务(非多线程) 151
6.1 OpenMP、 Fortran2008、 Intel TBB、 Intel Cilk Plus、 Intel MKL 152
6.1.1需在协处理器上创建任务 153
6.1.2线程池的重要性 154
6.2 OpenMP 154
6.2.1并行处理模型 155
6.2.2指导性语句 155
6.2.3 OpenMP上的有效控制 155
6.2.4嵌套 156
6.3 Fortran 2008 157
6.3.1 DO CONCURRENT 157
6.3.2 DO CONCURRENT以及数据竞争 157
6.3.3 DO CONCURRENT定义 158
6.3.4 DO CONCURRENT对比FOR ALL 159
6.3.5 DO CONCURRENT对比OpenMP “Parallel” 160
6.4 Intel TBB 160
6.4.1发展历史 162
6.4.2使用TBB 163
6.4.3 parallel_for 163
6.4.4 blocked_range 164
6.4.5 Partitioners 164
6.4.6 Parallel_reduce 165
6.4.7 Parallel_invoke 166
6.4.8 C++11相关 166
6.4.9 TBB总结 167
6.5 Cilk Plus 167
6.5.1发展历史 169
6.5.2从TBB借用组件 169
6.5.3向TBB提供组件 170
6.5.4关键字拼写 170
6.5.5 cilk_for 170
6.5.6 cilk_spawn与cilk_sync 171
6.5.7 Reducers(超对象) 172
6.5.8数组表示法与基本函数 173
6.5.9 Cilk Plus总结 173
6.6总结 173
6.7更多信息 173
第7章 分载(Offload) 175
7.1两种分载模式 176
7.2分载执行与本地执行 176
7.2.1非共享内存模式:使用分载编译器指导指令(Pragma) 177
7.2.2共享虚拟内存模式:通过共享虚拟内存使用分载 177
7.2.3 Intel数学函数库(Intel MKL)自动分载 178
7.3分载的语言扩展支持 178
7.3.1分载的编译器选项和环境变量 179
7.3.2分载的共享环境变量 181
7.3.3针对多个协处理器分载 181
7.4使用编译器指导指令分载 182
7.4.1设置协处理器上的变量与函数 184
7.4.2指针变量的内存分配与管理 186
7.4.3时间优化:坚持分配的另外一个原因 193
7.4.4对C/C++目标代码使用编译器指导指令 193
7.4.5对Fortran语言中的目标代码使用指导指令 195
7.4.6执行单一处理器时不创建代码 196
7.4.7英特尔MIC架构预定义宏 197
7.4.8 Fortran数组 197
7.4.9为部分C/C++数组分配内存 197
7.4.10为部分Fortran数组分配内存 198
7.4.11两变量间的数据转移 199
7.4.12分载代码指令使用的限制条件 200
7.5在共享虚拟存储器上使用分载 202
7.5.1使用共享内存及共享变量 203
7.5.2关于共享函数 204
7.5.3共享内存管理函数 204
7.5.4同步函数执行与异步函数执行:_Cilk_offload 204
7.5.5共享变量和函数:_Cilk shared 205
7.5.6_Cilk_shared和Cilk offload的使用规则 207
7.5.7处理器与目标之间的内存同步 208
7.5.8使用_Cilk offload写入具体目标代码 208
7.5.9使用虚拟内存分载代码的限制因素 209
7.5.10使用共享虚拟内存时定义持久性数据 210
7.5.11使用共享虚拟内存持久性数据的C++声明 212
7.6关于异步计算 212
7.7关于异步数据转移 213
7.8应用目标属性至多个声明 218
7.8.1分载使用的vec-report可选项 219
7.8.2测量分载区域的时间与数据 219
7.8.3 _Offoad_report 219
7.8.4在分载代码中使用库 220
7.8.5关于使用xiar和xild创建分载程序库 220
7.9在协处理器上执行I/O文件 221
7.10从分载代码中记录stdout和stderr 223
7.11总结 223
7.12更多信息 224
第8章 协处理器架构 225
8.1 Intel Xeon Phi协处理器产品家族 226
8.2协处理器卡的设计 227
8.3 Intel Xeon Phi协处理器芯片概述 228
8.4协处理器核架构 229
8.5指令集和多线程处理 230
8.6缓存组织和内存访问 232
8.7预取 234
8.8向量处理单元架构 234
8.9协处理器PCI-E系统接口和DMA 239
8.10协处理器电源管理 241
8.11可靠性、可用性和可维护性(RAS) 244
8.12协处理器系统管理控制器(SMC) 245
8.12.1传感器 246
8.12.2散热设计监控和控制 246
8.12.3风扇控制 247
8.12.4潜在应用影响 247
8.13基准测试 247
8.14总结 248
8.15 更多信息 248
第9章 协处理器系统软件 251
9.1协处理器软件体系架构概述 251
9.1.1对称性 253
9.1.2 Ring级别:用户态和内核态 253
9.2协处理器编程模型和选项 253
9.2.1宽度与深度 254
9 2.2 MPI编程模型 255
9.3协处理器软件体系架构组件 257
9.4英特尔众核平台软件栈 258
9 4.1 MYO: Mine Yours Ours 258
9.4.2 COI: Coprocessor Offload Infrastructure 259
9.4.3 SCIF: Symmetric Communications Interface 259
9.4.4 Virtual networking(NetDev)、TCP/IP及sockets 259
9.4.5协处理器系统管理 260
9.4.6面向MPI应用程序的协处理器组件 262
9.5 Linux对Intel Xeon Phi协处理器的支持 267
9.6优化内存分配的性能 268
9.6.1控制2MB内存页的数量 268
9.6.2监控协处理器上2MB内存页的数量 269
9.6.3分配2MB内存页的方法示例 269
9.7总结 270
9.8更多信息 271
第10章 协处理器的Linux系统 273
10.1协处理器Linux基础 273
10.2协处理器Linux系统的启动和配置简介 274
10.3协处理器Linux系统的默认配置 276
10.4修改协处理器配置 277
10.4.1可配置的组件 277
10.4.2配置文件 278
10.4.3配置启动参数 278
10.4.4协处理器根文件系统 280
10.5 micctrl工具 285
10.5.1协处理器状态控制 285
10.5.2启动协处理器 285
10.5.3关闭协处理器 286
10.5.4重新启动协处理器 286
10.5.5重置协处理器 286
10.5.6协处理器配置初始化和信息传播 287
10.5.7配置参数的辅助功能 288
10.5.8其他文件系统相关的帮助功能 290
10.6添加软件 290
10.6.1文件系统创建流程 291
10.6.2添加文件到根文件系统 292
10.6.3示例:添加一组全局访问文件 293
10.7 Linux系统在协处理器上的启动过程 294
10.8 Linux机群中的协处理器 296
10.8.1 Intel Cluster Ready 297
10.8.2如何使用Intel Cluster Checker 298
10.8.3 Intel Cluster Checker对协处理器的支持 298
10.9总结 300
10.10更多信息 301
第11章 数学库 303
11.1英特尔数学核心函数库综述 304
11.2英特尔数学核心函数库与英特尔编译器 305
11.3协处理器支持综述 305
11.3.1自动分载控制函数 306
11.3.2设置环境变量 308
11.4在本地模式下使用协处理器 309
11.5使用自动分载模式 310
11.5.1如何开启自动分载 310
11.5.2控制作业划分 311
11.5.3有效使用自动分载技巧 312
11.5.4有、无分载情况下高效使用英特尔MKL的技巧 313
11.6使用编译器辅助分载 314
11.7精度选择和变化 316
11.7.1快速超越函数和数学算法 316
11.7.2理解几种可能的浮点算法实现变种 316
11.8总结 319
11.9更多信息 319
第12章M PI 321
12.1 MPI总览 321
12.2在Intel Xeon Phi上运行MPI 322
12.3预备工作 326
12.4从MPI进程中分载 327
12.4.1 Hello World 327
12.4.2梯形积分算法 328
12.5协处理器本地使用MPI 331
12.5.1 Hello World(再次) 332
12.5.2梯形积分算法(回顾) 333
12.6总结 338
12.7更多信息 338
第13章 采样和计时 341
13.1协处理器事件监视寄存器 342
13.2效率指标 343
13.2.1 CPI 344
13.2.2计算与数据访问比率(Compute to Data Access Ratio) 347
13.3潜在性能问题 348
13.3.1通用缓存使用率(General Cache Usage) 349
13.3.2 TLB失效 351
13.3.3 VPU使用率 352
13.3.4内存带宽 353
13.4 Intel VTune Amplifier XE产品 355
13.5性能应用编程接口 356
13.6 MPI分析:英特尔追踪分析器与收集器 356
13.6.1生成跟踪文件:面向只在协处理器上运行的应用 356
13.6.2生成跟踪文件:面向同时在处理器和协处理器上运行的应用 357
13.7计时 357
13.7.1协处理器上的时钟源 358
13.7.2 MIC运行时间计数器(micetc) 358
13.7.3时间戳计数器(tsc) 358
13.7.4设置时钟源 359
13.75时间结构 359
13.7.6时间惩罚 360
13.7.7在分载区(offload region)测量时间和数据 361
13.8总结 361
13.9更多信息 361
第14章 总结 363
14.1建议 363
14.2附加资源 364
14.3将推出另一本书 364
14.4感谢读者反馈 364
术语表 365