出版者的话 推荐序 译者序 前言 第一部分 基 础 第1章 导论 2 1.1 并行的威力和潜能 2 1.1.1 并行,一个熟悉的概念 2 1.1.2 计算机程序中的并行 2 1.1.3 多核计算机,一个机遇 3 1.1.4 使用并行硬件的更多机遇 4 1.1.5 并行计算和分布式计算的比较 4 1.1.6 系统级并行 5 1.1.7 并行抽象的便利 5 1.2 考察顺序程序和并行程序 6 1.2.1 并行化编译器 6 1.2.2 范例求解的变化 7 1.2.3 并行前缀求和 8 1.3 使用多指令流实现并行 9 1.3.1 线程概念 9 1.3.2 统计3的个数的多线程求解方法 10 1.4 目标:可扩展性和性能可移植性 17 1.4.1 可扩展性 17 1.4.2 性能可移植性 18 1.4.3 原理第一 18 1.5 小结 19 历史回顾 19 习题 19 第2章 认识并行计算机 21 2.1 用可移植性衡量机器特征 21 2.2 6种并行机介绍 21 2.2.1 芯片多处理器 21 2.2.2 对称多处理器体系结构 23 2.2.3 异构芯片设计 26 2.2.4 机群 27 2.2.5 超级计算机 27 2.2.6 对6种并行计算机的评论 30 2.3 顺序计算机的抽象 30 2.3.1 应用RAM模型 31 2.3.2 评估RAM模型 31 2.4 PRAM:一种并行计算机模型 32 2.5 CTA:一种实际的并行计算机模型 32 2.5.1 CTA模型 33 2.5.2 通信时延 36 2.5.3 CTA的性质 36 2.6 存储器访问机制 37 2.6.1 共享存储器 37 2.6.2 单边通信 37 2.6.3 消息传递 38 2.6.4 存储器一致性模型 38 2.6.5 程序设计模型 39 2.7 进一步研究通信 40 2.8 CTA模型的应用 40 2.9 小结 41 历史回顾 41 习题 41 第3章 性能分析 43 3.1 动机和基本概念 43 3.1.1 并行和性能 43 3.1.2 线程和进程 43 3.1.3 时延和吞吐率 44 3.2 性能损失的原因 45 3.2.1 开销 45 3.2.2 不可并行代码 46 3.2.3 竞争 47 3.2.4 空闲时间 47 3.3 并行结构 48 3.3.1 相关性 48 3.3.2 相关性限制并行性 49 3.3.3 粒度 50 3.3.4 局部性 51 3.4 性能协调 51 3.4.1 通信和计算 52 3.4.2 存储器和并行性 52 3.4.3 开销与并行 52 3.5 性能度量 53 3.5.1 执行时间 54 3.5.2 加速比 54 3.5.3 超线性加速比 55 3.5.4 效率 55 3.5.5 加速比问题 55 3.5.6 可扩展加速比和固定加速比 56 3.6 可扩展性能 56 3.6.1 难于达到的可扩展性能 57 3.6.2 硬件问题 57 3.6.3 软件问题 58 3.6.4 问题规模的扩展 58 3.7 小结 59 历史回顾 59 习题 59 第二部分 并行抽象 第4章 并行程序设计起步 62 4.1 数据和任务并行 62 4.1.1 定义 62 4.1.2 数据和任务并行的说明 62 4.2 Peril-L记号 63 4.2.1 扩展C语言 63 4.2.2 并行线程 63 4.2.3 同步和协同 64 4.2.4 存储器模型 64 4.2.5 同步存储器 66 4.2.6 归约和扫描 67 4.2.7 归约的抽象 68 4.3 统计3的个数程序实例 68 4.4 并行性的表示 68 4.4.1 固定并行性 68 4.4.2 无限并行性 69 4.4.3 可扩展并行性 70 4.5 按字母顺序排序实例 71 4.5.1 无限并行性 71 4.5.2 固定并行性 72 4.5.3 可扩展并行性 73 4.6 三种求解方法的比较 77 4.7 小结 78 历史回顾 78 习题 78 第5章 可扩展算法技术 80 5.1 独立计算块 80 5.2 Schwartz算法 80 5.3 归约和扫描抽象 82 5.3.1 通用归约和扫描举例 83 5.3.2 基本结构 84 5.3.3 通用归约结构 86 5.3.4 通用扫描组件举例 87 5.3.5 应用通用扫描 88 5.3.6 通用向量操作 89 5.4 静态为进程分配工作 89 5.4.1 块分配 90 5.4.2 重叠区域 91 5.4.3 循环分配和块循环分配 92 5.4.4 不规则分配 94 5.5 动态为进程分配工作 95 5.5.1 工作队列 95 5.5.2 工作队列的变体 97 5.5.3 案例研究:并发存储器分配 97 5.6 树 99 5.6.1 按子树分配 99 5.6.2 动态分配 100 5.7 小结 100 历史回顾 100 习题 101