(特价书)OpenMP核心技术指南
聚焦于OpenMP核心特性,轻松入门,快速掌握基于OpenMP的多线程编程。
基本信息

编辑推荐
OpenMP
核心技术指南
The OpenMP Common Core: Making OpenMP Simple Again
蒂莫西·G. 马特森(Timothy G. Mattson)
何云(Yun (Helen) He)
爱丽丝·E. 康尼西(Alice E. Koniges)
20余年教学经验精华+编程驱动模式+主动学习体验=化繁为简的OpenMP学习之旅!
聚焦于OpenMP核心特性,轻松入门,快速掌握基于OpenMP的多线程编程。
内容简介
目录
序言
前言
第一部分 做好学习OpenMP的准备
第1章 并行计算 2
1.1 并行计算的基本概念 2
1.2 并发性的兴起 4
1.3 并行硬件 5
1.3.1 多处理器系统 5
1.3.2 图形处理单元 8
1.3.3 分布式内存集群 10
1.4 多处理器计算机的并行软件 10
第2章 性能语言 13
2.1 基础:FLOPS、加速比和并行效率 13
2.2 阿姆达尔定律 16
2.3 并行开销 17
2.4 强扩展与弱扩展 19
2.5 负载均衡 19
2.6 用roofline模型理解硬件 21
第3章 什么是OpenMP 23
前言
本书是关于如何学习OpenMP的。我们假设读者没有多线程的经验,也没有OpenMP的知识。我们将材料分块有序引入,以便读者有效地学习这门语言。这与参考指南不同,在参考指南中,你会通过系统的关键元素来逐一了解每个元素的完整描述。在本书中,我们介绍了一些想法和支持这些想法的OpenMP构造(construct)。然后,在引入更复杂的想法时,我们会重新审视OpenMP构造,并描述该构造的其他方面。对于任何一个给定的OpenMP构造,关于能用它做的一切事情的完整描述可能分散在几个章节中。
这样的安排是不会出现在参考指南中的。但正如你希望看到的那样,这对于学习一门新的编程语言来说是非常有益的。例如,在教孩子数学函数的概念时,你永远不会在接近奇点时引入极限和函数值的概念。你会等待,往往是很多年后,当孩子掌握了函数的概念后,而且是通过长期的练习掌握后,再引入极限来完成函数的完整定义。同样,对于OpenMP也是如此。在介绍创建线程的并行构造(parallel construct)时,解释所有控制数据环境的机制会让人难以接受。不如先介绍线程的创建以及如何利用线程做有用的工作。然后,在掌握了管理线程的基础知识后,再回到线程创建,但此时拥有了控制数据环境的能力。
使用本书的关键是主动地跟随本书练习。下载一个OpenMP编译器(gcc编译器和大多数商业编译器一样支持OpenMP)。随着每个OpenMP指令或API例程的引入,编写程序进行实验。以不同的方式使用它们,理解它们的工作原理,然后再继续阅读。在写代码之前,不要只把书从头到尾读一遍,暂停一下,边看书边写代码。
为了支持这种主动学习的方式,本书网站(http://www.ompcore.com)提供了各种各样的程序和练习。请经常查阅该网站,我们会持续更新,不断分享关于OpenMP通用核心的新知识。
最后说一下编程语言。OpenMP支持C、C++和Fortran,理想的情况是本书应该包含这三种语言的例子。然而,这样做会大大扩大本书的篇幅和范围,对读者来说,这些额外的工作真的没有什么好处。除了极少数的例外情况(书中有详细说明),OpenMP在三种语言之间基本上是一样的,知道了一种语言的OpenMP,就会知道三种语言的OpenMP。因此,我们选择为C/C++和Fortran定义构造,但书中的例子和大部分的讨论都以C语言为主。我们认为这是一个正确的折中方案,因为在高性能计算领域,C语言是程序员要掌握的最基本的知识,即使是主要编写Fortran代码的程序员,也要了解C语言的基础知识。
为了帮助使用Fortran的读者,我们在本书网站上提供了所有例子的Fortran版本。对于少数不懂C语言的Fortran程序员,我们还提供了C语言的简短教程。我们相信,本书与这些在线资源对Fortran程序员来说是重要的学习资料。因此,请不要因为满篇的C代码而使你对本书望而却步。如果你想学习OpenMP,无论是用C、C++还是Fortran编程,本书都会对你有所帮助。
致谢
本书的内容是在20年的OpenMP教学基础上煞费苦心地开发出来的。例子、材料的组织流程和概念的描述方式等,都是由讲师团队在各种超级计算会议的讲座上研究出来的。我们要特别感谢Mark Bull(EPCC)、Sanjiv Shah(Intel)、Barbara Chapman(石溪大学)、Larry Meadows(Intel)、Paul Petersen(Intel)和Simon McIntosh-Smith(布里斯托大学)。内存模型的内容整合起来特别困难,田新民(Intel)、Michael Klemm(Intel),特别是Deepak Eachempati(Cray)在帮助我们定义这些材料方面发挥了重要作用。为了开发内存模型的例子,我们需要访问各种各样的架构。Simon McIntosh-Smith给予我们非常大的帮助,协助我们访问布里斯托大学的Isambard系统。
我们非常感谢MIT出版社的审稿团队。在从定稿到出版的过程中,他们的反馈对我们帮助很大。在这个团队中,我们特别要提到Ruud van der Pas(Oracle)。Ruud是我们的好朋友,他从一开始就鼓励我们参与这个项目。他对本书进行了非常仔细的审阅,做出了超出其职责范围的贡献。
我们还要感谢OpenMP架构审查委员会允许我们使用OpenMP规范和部分示例文档。最后,我们要感谢整个OpenMP社区的人:Bronis de Supinski(LLNL)和他领导的OpenMP语言委员会,与我们合作过的OpenMP程序员,以及过去使用过我们的教程的所有学生。没有他们,我们不可能创作出这样的书。
序言
然而,在OpenMP的世界里,并不是一切都很顺利。伴随着缓慢演变而增加的复杂度可能导致其“窒息”,而这种复杂度的增加常常困扰着成功的编程语言。为了适应新的硬件,新的功能会被添加到OpenMP中。当少数算法中出现了OpenMP难以处理的极端情况时,需要在熟悉的构造中加入新的子句。我们创建OpenMP时,有些没有考虑到的算法现在被认为是关键性的,于是又定义了新的构造(construct)。在经历了20年这样的过程之后,很难再看到简单的API—那些我们在1996年开始创建OpenMP时所设想的API。
通过这本书,我们返璞归真,回到创建OpenMP时的简约状态。增加复杂性是要有理由的。我们并不是要让OpenMP的进步倒退,而是要改变讲解OpenMP的方式。刚接触OpenMP的读者应该学习OpenMP中的一个小子集,这些内容在大多数程序中都会用到。只有掌握了这套通用的核心构造,才是时候去探索这门语言中更细微、更复杂的部分。
如果你是OpenMP的新手,这本书就是为你准备的,可以让你学习OpenMP的通用核心。有了这个基础,当你探索现代硬件上广泛的并行算法时,一切都是可能的。
Timothy G. Mattson
2019年5月
媒体评论
——Barbara Chapman,石溪大学应用数学、统计和计算机科学教授
OpenMP API用于为各种并行系统编程,从基本的多核处理器到大型共享内存和异构系统的协处理器。要掌握OpenMP,你需要先掌握该语言的核心特性。本书基于作者20多年来讲授OpenMP的经验编写而成,是帮助读者打好基础的绝佳工具。
——Michael Klemm,OpenMP架构审查委员会CEO
这本书值得放在每一位OpenMP程序员的书架上。这不仅是初学者的必读之作,经验丰富的开发人员也会发现其价值所在。特别是关于内存模型的部分,对于这一最难掌握的内容,书中的讲解非常到位。
——Ruud van der Pas,Oracle杰出工程师,著有Using OpenMP—The Next Step