具体描述
本书全面涵盖了并行软件和硬件的方方面面,深入浅出地介绍如何使用mpi(分布式内存编程)、pthreads和openmp(共享内存编程)编写高效的并行程序。各章节包含了难易程度不同的编程习题。
本书可以用做计算机科学专业低年级本科生的专业课程的教材,也可以作为软件开发人员学习并行程序设计的专业参考书。
作者简介
目录信息
出版者的话
译者序
本书赞誉
前言
致谢
第1章为什么要并行计算
1.1为什么需要不断提升的性能
1.2为什么需要构建并行系统
1.3为什么需要编写并行程序
1.4怎样编写并行程序
1.5我们将做什么
1.6并发、并行、分布式
1.7本书的其余部分
1.8警告
1.9字体约定
1.10小结
1.11习题
第2章并行硬件和并行软件
2.1背景知识
.2.1.1冯·诺依曼结构
2.1.2进程、多任务及线程
2.2对冯·诺依曼模型的改进
2.2.1cache基础知识
2.2.2cache映射
2.2.3cache和程序: 一个实例
2.2.4虚拟存储器
2.2.5指令级并行
2.2.6硬件多线程
2.3并行硬件
2.3.1simd系统
2.3.2mimd系统
2.3.3互连网络
2.3.4cache一致性
2.3.5共享内存与分布式内存
2.4并行软件
2.4.1注意事项
2.4.2进程或线程的协调
2.4.3共享内存
2.4.4分布式内存
2.4.5混合系统编程
2.5输入和输出
2.6性能
2.6.1加速比和效率
2.6.2阿姆达尔定律
2.6.3可扩展性
2.6.4计时
2.7并行程序设计
2.8编写和运行并行程序
2.9假设
2.10小结
2.10.1串行系统
2.10.2并行硬件
2.10.3并行软件
2.10.4输入和输出
2.10.5性能
2.10.6并行程序设计
2.10.7假设
2.11习题
第3章用mpi进行分布式内存编程
3.1预备知识
3.1.1编译与执行
3.1.2mpi程序
3.1.3mpi_init和mpi_finalize
3.1.4通信子、mpi_comm_size和mpi_comm_rank
3.1.5spmd程序
3.1.6通信
3.1.7mpi_send
3.1.8mpi_recv
3.1.9消息匹配
3.1.10status_p参数
3.1.11mpi_send和mpi_recv的语义
3.1.12潜在的陷阱
3.2用mpi来实现梯形积分法
3.2.1梯形积分法
3.2.2并行化梯形积分法
3.3i/o处理
3.3.1输出
3.3.2输入
3.4集合通信
3.4.1树形结构通信
3.4.2mpi_reduce
3.4.3集合通信与点对点通信
3.4.4mpi_allreduce
3.4.5广播
3.4.6数据分发
3.4.7散射
3.4.8聚集
3.4.9全局聚集
3.5mpi的派生数据类型
3.6mpi程序的性能评估
3.6.1计时
3.6.2结果
3.6.3加速比和效率
3.6.4可扩展性
3.7并行排序算法
3.7.1简单的串行排序算法
3.7.2并行奇偶交换排序
3.7.3mpi程序的安全性
3.7.4并行奇偶交换排序算法的重要内容
3.8小结
3.9习题
3.10编程作业
第4章用pthreads进行共享内存编程
4.1进程、线程和pthreads
4.2“hello,world”程序
4.2.1执行
4.2.2准备工作
4.2.3启动线程
4.2.4运行线程
4.2.5停止线程
4.2.6错误检查
4.2.7启动线程的其他方法
4.3矩阵-向量乘法
4.4临界区
4.5忙等待
4.6互斥量
4.7生产者-消费者同步和信号量
4.8路障和条件变量
4.8.1忙等待和互斥量
4.8.2信号量
4.8.3条件变量
4.8.4pthreads路障
4.9读写锁
4.9.1链表函数
4.9.2多线程链表
4.9.3pthreads读写锁
4.9.4不同实现方案的性能
4.9.5实现读写锁
4.10缓存、缓存一致性和伪共享
4.11线程安全性
4.12小结
4.13习题
4.14编程作业
第5章用openmp进行共享内存编程
5.1预备知识
5.1.1编译和运行openmp程序
5.1.2程序
5.1.3错误检查
5.2梯形积分法
5.3变量的作用域
5.4归约子句
5.5parallel for指令
5.5.1警告
5.5.2数据依赖性
5.5.3寻找循环依赖
5.5.4π值估计
5.5.5关于作用域的更多问题
5.6更多关于openmp的循环:排序
5.6.1冒泡排序
5.6.2奇偶变换排序
5.7循环调度
5.7.1schedule子句
5.7.2static调度类型
5.7.3dynamic和guided调度类型
5.7.4runtime调度类型
5.7.5调度选择
5.8生产者和消费者问题
5.8.1队列
5.8.2消息传递
5.8.3发送消息
5.8.4接收消息
5.8.5终止检测
5.8.6启动
5.8.7atomic指令
5.8.8临界区和锁
5.8.9在消息传递程序中使用锁
5.8.10critical指令、atomic指令、锁的比较
5.8.11经验
5.9缓存、缓存一致性、伪共享
5.10线程安全性
5.11小结
5.12习题
5.13编程作业
第6章并行程序开发
6.1n体问题的两种解决方法
6.1.1问题
6.1.2两个串行程序
6.1.3并行化n体算法
6.1.4关于i/o
6.1.5用openmp并行化基本算法
6.1.6用openmp并行化简化算法
6.1.7评估openmp程序
6.1.8用pthreads并行化算法
6.1.9用mpi并行化基本算法
6.1.10用mpi并行化简化算法
6.1.11mpi程序的性能
6.2树形搜索
6.2.1递归的深度优先搜索
6.2.2非递归的深度优先搜索
6.2.3串行实现所用的数据结构
6.2.4串行实现的性能
6.2.5树形搜索的并行化
6.2.6采用pthreads实现的静态并行化树搜索
6.2.7采用pthreads实现的动态并行化树搜索
6.2.8pthreads树搜索程序的评估
6.2.9采用openmp实现的并行化树搜索程序
6.2.10openmp实现的性能
6.2.11采用mpi和静态划分来实现树搜索
6.2.12采用mpi和动态划分来实现树搜索
6.3忠告
6.4选择哪个api
6.5小结
6.5.1pthreads和openmp
6.5.2mpi
6.6习题
6.7编程作业
第7章接下来的学习方向
参考文献
索引
· · · · · · (收起)
读后感
首先,本书前两章,主要介绍了并行编程的一些基本知识,包括并行编程的重要性,并行硬件的几种方式以及并行软件的几种范式。其中并行硬件的几种方式包括,1,SIMD,单指令多数据流;2,MIMD,多指令多数据流。并行软件,实践中主要采用的是SPMD方式,即单程序多数据流方式。优...
首先,本书前两章,主要介绍了并行编程的一些基本知识,包括并行编程的重要性,并行硬件的几种方式以及并行软件的几种范式。其中并行硬件的几种方式包括,1,SIMD,单指令多数据流;2,MIMD,多指令多数据流。并行软件,实践中主要采用的是SPMD方式,即单程序多数据流方式。优...
首先,本书前两章,主要介绍了并行编程的一些基本知识,包括并行编程的重要性,并行硬件的几种方式以及并行软件的几种范式。其中并行硬件的几种方式包括,1,SIMD,单指令多数据流;2,MIMD,多指令多数据流。并行软件,实践中主要采用的是SPMD方式,即单程序多数据流方式。优...
首先,本书前两章,主要介绍了并行编程的一些基本知识,包括并行编程的重要性,并行硬件的几种方式以及并行软件的几种范式。其中并行硬件的几种方式包括,1,SIMD,单指令多数据流;2,MIMD,多指令多数据流。并行软件,实践中主要采用的是SPMD方式,即单程序多数据流方式。优...
首先,本书前两章,主要介绍了并行编程的一些基本知识,包括并行编程的重要性,并行硬件的几种方式以及并行软件的几种范式。其中并行硬件的几种方式包括,1,SIMD,单指令多数据流;2,MIMD,多指令多数据流。并行软件,实践中主要采用的是SPMD方式,即单程序多数据流方式。优...
用户评价
说实话,我拿到这本书的时候,心里其实是有点打鼓的。毕竟“并行程序设计”这个词听起来就不是那么容易消化的。我平时的工作主要集中在单线程的应用开发上,对于多线程、多进程这些概念,也只停留在一些模糊的了解层面,真要让我去设计一个能安全高效地进行并发操作的程序,我感觉自己还是有点心虚。我希望这本书能成为我的“救星”,它能够帮我扫清那些笼罩在并行程序设计上的迷雾。我最看重的是它能否在理论讲解的同时,提供足够多的实践指导。我希望书中能够介绍一些主流的并行编程模型和相关的工具库,例如OpenMP、MPI,甚至是CUDA,并针对这些技术给出清晰的代码示例,最好是那种可以“拿来就用”的,或者是经过精心设计的、能够展示关键技术点的例子。当然,仅仅有代码是不够的,我更希望书中能深入剖析这些代码背后的设计思路和潜在的陷阱,让我明白为什么这样写是正确的,又有哪些地方容易出错。毕竟,并行程序设计的“坑”实在是太多了,稍有不慎就可能导致死锁、竞态条件等问题,这些都是我非常想避免的。
这本书的封面设计就透着一股严谨和专业的气息,深蓝色的背景搭配简洁的白色字体,仿佛预示着即将展开的知识海洋。作为一名初涉并行程序设计的开发者,我一直对如何充分利用多核处理器、提升程序性能感到好奇,同时也伴随着一丝畏惧。并行程序设计的概念,在我看来,一直是一个相对抽象且门槛较高的领域。我曾尝试阅读一些零散的在线教程,但往往在理解核心概念时感到力不从心,更不用说实际动手去编写能够有效运行的并行程序了。我对这本书的期待,不仅仅是学习如何写代码,更是希望能建立起一套清晰的、系统化的理解框架。我希望它能循序渐进地解释并行计算的基本原理,例如线程、进程、同步机制、并发模型等等,并且能够用通俗易懂的语言来阐述这些概念,避免过多的专业术语堆砌,让我这个初学者能够快速入门。我特别期待书中能有丰富的图示和生动的案例,能够将那些抽象的概念具象化,让我更容易理解它们在实际应用中的体现。同时,作为一本“导论”,我希望它能为我打开一扇通往更深层次并行程序设计的大门,让我对未来的学习方向有一个大致的了解,并能激发我继续深入探索的兴趣。
我是一名对底层技术有着浓厚兴趣的程序员,一直以来都对操作系统底层的工作原理以及如何优化程序性能有着强烈的探索欲。在众多技术领域中,并行程序设计无疑是最具挑战性也最令人着迷的方向之一。我希望这本书能够提供一个全面而深入的视角,不仅仅局限于表面的API调用,而是能够深入到并行计算的本质,例如共享内存模型、消息传递模型,以及它们在不同硬件架构下的具体实现。我希望书中能够详细阐述不同并行编程范式的优缺点,以及在何种场景下选择何种范式更为合适。比如,对于CPU密集型的任务,是选择线程级并行还是进程级并行?对于大规模的分布式计算,MPI又扮演着怎样的角色?我甚至希望书中能涉及到一些底层的优化技巧,例如如何有效地进行数据划分、如何减少线程间的通信开销、如何利用CPU缓存提高访问效率等等。当然,这些都建立在我对并行计算已有一定基础知识的前提下。我期待这本书能够成为我进阶的阶梯,为我打开更广阔的视角,让我能够更自信地去设计和实现高性能的并行应用程序。
我是一名对算法和数据结构有着极高追求的工程师,一直致力于寻找更高效的解决方案来处理海量数据。在我看来,并行程序设计是实现这种追求的必经之路。我希望这本书能够提供一种全新的思维模式,让我能够跳出传统的串行思维,去构想如何将一个复杂的计算任务分解成多个可独立执行的部分,并有效地协同工作。我期待书中能够深入讲解如何识别程序中的“并行化点”,以及如何选择合适的并行粒度。我尤其关注书中关于“同步与互斥”的讨论,以及如何避免那些常见的并发错误,例如竞态条件、死锁和活锁。我希望书中能够提供一些实用的设计模式,能够帮助我构建健壮且高效的并行系统。此外,对于大规模分布式系统中的并行计算,我也希望这本书能够有所涉及,介绍一些相关的技术和挑战。我希望这本书能成为我工具箱里不可或缺的一部分,让我在面对复杂的计算问题时,能够更加从容地运用并行化的力量。
我是一名在学术界工作的研究人员,对并行算法的设计和分析有着深入的研究。在撰写论文和指导学生的过程中,我经常需要查阅相关的文献和教材。我希望这本书能够提供一个扎实的理论基础,能够系统地介绍并行程序设计的核心概念和方法论。我期待书中能够包含对经典并行算法的分析,例如并行排序、并行搜索、矩阵乘法等,并深入探讨它们的复杂度分析和性能评估。同时,我希望书中能够涵盖一些前沿的研究方向,例如异构计算、GPU并行计算、以及新兴的并行编程模型。我特别关注书中是否能够对并行程序的正确性进行形式化验证,以及如何有效地进行并行程序的性能调优和调试。此外,我希望书中能够提供丰富的参考文献,方便我进一步查阅更深入的资料。这本书的“导论”定位,也意味着它应该能够为初学者提供一个清晰的学习路径,同时又能为有经验的研究人员提供一个回顾和拓展的平台。
讲了三种并行软件,程序设计概念和方法渗透在示范代码中,比较基础,适合入门
书是好书,翻译扣两星,翻译非常不负责任非常垃圾,得对照英文版才不会被带沟里。 惨遭翻译。
讲了三种并行软件,程序设计概念和方法渗透在示范代码中,比较基础,适合入门
的确是不错的导论书,可惜翻译有点小错。 p119 6行第二个应该是sem_post(&barrier_sum),p126 4.9.4倒数第二段到底哪个快完全写反。
这书真的是导论,前面两章总论,后面就真刀真枪上工具了。主要是结合MPI,OpenMPI实际的讲述该如何做。一言不合上代码还是很好的,talk is cheap, show me your code.