第1章 多核技术导论 1
1.1 微处理器发展史 1
1.1.1 计算机与微处理器 1
1.1.2 4位、8位与16位微处理器 2
1.1.3 32位微处理器 3
1.2 并行计算机 6
1.2.1 并行处理思想与弗林分类 6
1.2.2 超级计算机 7
1.3 超大规模集成电路与系统芯片发展 8
1.3.1 超大规模集成电路技术 8
1.3.2 系统芯片 10
1.4 片上多核处理器架构 12
1.4.1 多核芯片 12
1.4.2 片上多核处理器体系结构 13
1.4.3 典型多核芯片架构 13
1.5 芯片组对多核的支持 16
1.5.1 固件 16
1.5.2 EFI对多核支持 20
1.6 操作系统对多核处理器的支持方法 22
1.6.1 调度与中断 22
1.6.2 输入输出系统 25
1.6.3 存储管理与文件系统 26
1.6.4 虚拟化技术 26
1.6.5 典型的支持多核的操作系统 28
本章小结 30
第2章 并行计算基础 31
2.1 并行计算机体系结构 31
2.1.1 多级存储体系结构 32
2.1.2 并行计算机访存模型 34
2.2 并行计算模型 36
2.2.1 SIMD同步并行计算模型 37
2.2.2 MIMD异步并行计算模型 38
2.3 进程 40
2.3.1 进程 41
2.3.2 进程间通信 41
2.3.3 影响通信系统性能的因素 42
2.4 线程 43
2.5 并行编程环境 44
2.6 编程语言与编译器 45
2.6.1 自动并行 45
2.6.2 HPF:数据并行编程 46
2.6.3 OpenMP:共享存储并行编程 47
2.6.4 小结 48
2.7 并行计算性能评测 49
2.7.1 并行程序执行时间 49
2.7.2 加速比性能定律 50
2.7.3 并行程序性能评价方法 52
2.7.4 程序性能优化 54
2.8 常用并行数值算法 59
2.8.1 并行矩阵乘法 60
2.8.2 线性代数方程组并行求解方法 63
2.8.3 快速傅里叶变换 66
2.9 并行编译器 69
2.9.1 流分析 69
2.9.2 代码优化 71
2.9.3 代码生成 72
本章小结 72
第3章 线程的基本概念 73
3.1 多线程的概念 73
3.2 用户级线程和内核级线程 74
3.3 多线程的映射模型 75
3.4 线程的生命周期 76
3.5 多线程环境下的进程控制语义 77
3.6 线程的同步 78
3.6.1 互斥量 79
3.6.2 信号量 80
3.6.3 条件变量 80
3.6.4 锁的粒度 81
3.6.5 死锁、饿死与活锁 82
本章小结 82
第4章 Windows多线程编程及调优 83
4.1 Windows线程库介绍 83
4.2 使用Win32线程API 84
4.2.1 线程创建 84
4.2.2 线程管理 86
4.2.3 线程终结 87
4.2.4 Win32多线程的实现 88
4.3 线程执行和资源存取 89
4.3.1 Win32线程同步的实现 89
4.3.2 MFC线程同步的实现 101
4.3.3 .Net Framework线程同步的实现 104
4.4 多线程调试与优化技术 108
4.4.1 调试器中的数据 109
4.4.2 跟踪点/断点 109
4.4.3 线程命名 112
4.4.4 调试多线程程序 113
4.4.5 调试与优化工具 115
本章小结 117
第5章 Linux多线程编程 118
5.1 POSIX线程库Pthreads介绍 118
5.2 POSIX Pthreads库提供的基本线程的操作 118
5.2.1 线程的创建 118
5.2.2 线程的退出 119
5.2.3 等待线程结束 120
5.2.4 线程的分离 120
5.2.5 获得当前线程标志 121
5.2.6 使用Pthreads基本函数编写的一个程序 121
5.3 线程的属性 123
5.4 线程互斥和同步 128
5.4.1 mutex 128
5.4.2 条件变量 131
5.4.3 线程的撤销 136
5.4.4 POSIX 信号量 141
5.4.5 线程和信号处理 144
5.5 使用GDB调试线程以及线程的调优 148
5.6 使用Pthreads库的综合例子 152
本章小结 158
第6章 OpenMP多线程编程及性能优化 159
6.1 OpenMP编程简介 159
6.1.1 OpenMP多线程编程发展概况 159
6.1.2 OpenMP多线程编程基础 160
6.1.3 使用Microsoft Visual Studio.Net 2005编写OpenMP程序 163
6.1.4 小结 167
6.2 OpenMP多线程应用程序编程技术 168
6.2.1 循环并行化 168
6.2.2 并行区域编程 176
6.2.3 线程同步 183
6.3 OpenMP多线程应用程序性能分析 192
6.3.1 影响性能的主要因素 192
6.3.2 OpenMP程序性能分析实例 194
本章小结 200
第7章 MPI编程及性能优化 201
7.1 MPI简介 201
7.1.1 MPI及其历史 201
7.1.2 典型MPI实现简介 202
7.1.3 MPI程序特点 203
7.1.4 本章内容组织 206
7.2 MPICH的安装和配置 206
7.2.1 在Linux上安装和配置MPICH2 207
7.2.2 在Windows上安装MPICH2 211
7.3 MPI编程基础 215
7.3.1 简单的MPI程序示例 215
7.3.2 MPI程序的4个基本函数 216
7.3.3 MPI的点对点通信 217
7.3.4 消息管理7要素 222
7.3.5 统计时间 228
7.3.6 错误管理 230
7.3.7 小结 230
7.4 MPI群集通信 230
7.4.1 同步 231
7.4.2 广播 231
7.4.3 聚集 231
7.4.4 播撒 232
7.4.5 扩展的聚集和播撒操作 232
7.4.6 全局交换 233
7.4.7 规约与扫描 233
7.4.8 简单示例 234
7.4.9 小结 238
7.5 MPI性能分析与优化举例 238
7.5.1 通信开销的测试 238
7.5.2 选取计算粒度 240
7.5.3 聚合消息 241
7.5.4 解决负载均衡问题 242
7.5.5 小结 243
本章小结 243
第8章 多核软件工具介绍 245
8.1 C++编译器 245
8.1.1 编译器对多核的支持 245
8.1.2 C++编译器实验 247
8.2 VTune性能分析器 253
8.2.1 性能分析器功能与使用方法 253
8.2.2 性能分析器实验 258
8.3 MKL数学核心函数库 260
8.3.1 MKL数学核心函数库功能与特性 261
8.3.2 MKL数学核心函数库性能 262
8.3.3 MKL数学核心函数库实验 263
8.4 Thread Checker线程检查器 265
8.4.1 线程检查器功能与使用 265
8.4.2 线程检查器实验 267
8.5 Thread Profiler线程档案器 273
8.5.1 线程档案器的功能与使用 273
8.5.2 线程档案器实验 275
参考文献 281