Intel Xeon Phi协处理器高性能编程指南

978-7-115-34784-8
作者: 【美】Jim Jeffers James Reinders
译者: 陈健周姗孙相征李慧游亮杨昆李伯杨李艳新李津宇
编辑: 王峰松

图书目录:

目 录

第 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 _Offload_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章 MPI 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.7.5 时间结构 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

详情

本书将介绍Intel最新推出的协处理器Xeon Phi的实现结构和编程知识,并指导读者如何在此平台上高效的完成自己的大规模计算任务。同时,本书还会讲解如何把现有的应用从X86平台移植到Xeon Phi之上,并借助优化措施,获得功耗、性能之间的平衡。

图书摘要

相关图书

GPU编程实战(基于Python和CUDA)
GPU编程实战(基于Python和CUDA)
C++并发编程实战(第2版)
C++并发编程实战(第2版)
Scala并发编程 第2版
Scala并发编程 第2版
Android 并发开发
Android 并发开发
OpenCL实战
OpenCL实战
C++ AMP:用Visual C++加速大规模并行计算
C++ AMP:用Visual C++加速大规模并行计算

相关文章

相关课程