第三部分 并行程序设计语言 第6章 线程程序设计 104 6.1 POSIX Threads 104 6.1.1 线程的创建和销毁 104 6.1.2 互斥 108 6.1.3 同步 110 6.1.4 安全性问题 117 6.1.5 性能问题 120 6.1.6 案例研究1:连续过度松弛 124 6.1.7 案例研究2:重叠同步与计算 129 6.1.8 案例研究3:多核芯片上的流计算 134 6.2 Java Threads 134 6.2.1 同步方法 135 6.2.2 同步语句 136 6.2.3 统计3的个数程序实例 136 6.2.4 易变存储器 138 6.2.5 原子对象 138 6.2.6 锁对象 138 6.2.7 执行器 138 6.2.8 并发集合 138 6.3 OpenMP 138 6.3.1 统计3的个数程序实例 139 6.3.2 parallel for的语义局限 141 6.3.3 归约 141 6.3.4 线程的行为和交互 142 6.3.5 段 142 6.3.6 OpenMP总结 143 6.4 小结 143 历史回顾 143 习题 143 第7章 MPI和其他局部视图语言 145 7.1 MPI:消息传递接口 145 7.1.1 统计3的个数程序实例 145 7.1.2 组和通信子 152 7.1.3 点对点通信 152 7.1.4 集合通信 154 7.1.5 举例:连续过度松弛 157 7.1.6 性能问题 159 7.1.7 安全性问题 164 7.2 分区的全局地址空间语言 164 7.2.1 Co-Array Fortran 165 7.2.2 Unified Parallel C 166 7.2.3 Titanium 167 7.3 小结 167 历史回顾 168 习题 168 第8章 ZPL和其他全局视图语言 169 8.1 ZPL程序设计语言 169 8.2 ZPL基本概念 169 8.2.1 区域 170 8.2.2 数组计算 171 8.3 生命游戏实例 173 8.3.1 问题 173 8.3.2 解决方案 173 8.3.3 如何实现 174 8.3.4 生命游戏的哲学 175 8.4 与众不同的ZPL特征 175 8.4.1 区域 175 8.4.2 语句级索引 175 8.4.3 区域的限制 176 8.4.4 性能模型 176 8.4.5 用减法实现加法 177 8.5 操作不同秩的数组 177 8.5.1 部分归约 177 8.5.2 扩充 178 8.5.3 扩充的原理 179 8.5.4 数据操作举例 179 8.5.5 扩充区域 180 8.5.6 矩阵乘 181 8.6 用重映射操作重排数据 182 8.6.1 索引数组 183 8.6.2 重映射 183 8.6.3 排序举例 185 8.7 ZPL程序的并行执行 186 8.7.1 编译器的职责 186 8.7.2 指定进程数 187 8.7.3 为进程分配区域 187 8.7.4 数组分配 188 8.7.5 标量分配 188 8.7.6 工作分派 188 8.8 性能模型 189 8.8.1 应用实例1:生命游戏 190 8.8.2 应用实例2:SUMMA算法 190 8.8.3 性能模型总结 191 8.9 NESL并行语言 191 8.9.1 语言概念 191 8.9.2 用嵌套并行实现矩阵乘 192 8.9.3 NESL复杂性模型 192 8.10 小结 192 历史回顾 193 习题 193 第9章 对并行程序设计现状的评价 194 9.1 并行语言的四个重要性质 194 9.1.1 正确性 194 9.1.2 性能 195 9.1.3 可扩展性 196 9.1.4 可移植性 196 9.2 评估现有方法 196 9.2.1 POSIX Threads 196 9.2.2 Java Threads 197 9.2.3 OpenMP 197 9.2.4 MPI 197 9.2.5 PGAS语言 198 9.2.6 ZPL 198 9.2.7 NESL 199 9.3 可供将来借鉴的经验 199 9.3.1 隐藏并行 199 9.3.2 透明化性能 200 9.3.3 局部性 200 9.3.4 约束并行 200 9.3.5 隐式并行与显式并行 201 9.4 小结 201 历史回顾 201 习题 202 第四部分 展 望 第10章 并行程序设计的未来方向 204 10.1 附属处理器 204 10.1.1 图形处理部件 204 10.1.2 Cell处理器 207 10.1.3 附属处理器的总结 207 10.2 网格计算 208 10.3 事务存储器 209 10.3.1 与锁的比较 210 10.3.2 实现方法 210 10.3.3 未解决的问题 211 10.4 MapReduce 212 10.5 问题空间的提升 214 10.6 新出现的语言 214 10.6.1 Chapel 215 10.6.2 Fortress 215 10.6.3 X10 216 10.7 小结 218 历史回顾 218 习题 218 第11章 编写并行程序 219 11.1 起步 219 11.1.1 访问和软件 219 11.1.2 Hello, World 219 11.2 并行程序设计的建议 220 11.2.1 增量式开发 220 11.2.2 侧重并行结构 220 11.2.3 并行结构的测试 221 11.2.4 顺序程序设计 221 11.2.5 乐意写附加代码 222 11.2.6 测试时对参数的控制 222 11.2.7 功能性调试 223 11.3 对结课课程设计的设想 223 11.3.1 实现现有的并行算法 223 11.3.2 与标准的基准测试程序媲美 224 11.3.3 开发新的并行计算 224 11.4 性能度量 225 11.4.1 与顺序求解方法比较 226 11.4.2 维护一个公正的实验设置 226 11.5 了解并行性能 227 11.6 性能分析 227 11.7 实验方法学 228 11.8 可移植性和微调 229 11.9 小结 229 历史回顾 229 习题 229 术语表 230 参考文献 234