首页>参考读物>计算机科学与技术>计算机科学理论与基础知识

OpenMP核心技术指南
作者 : [美] 蒂莫西·G. 马特森(Timothy G. Mattson) 何云(Yun (Helen) He) 爱丽丝·E. 康尼西(Alice E. Koniges) 著
译者 : 黄智濒 杨旭东 译
出版日期 : 2021-06-09
ISBN : 978-7-111-68434-3
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 209
开本 : 16
原书名 : The OpenMP Common Core: Making OpenMP Simple Again
原出版社: MIT Press
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

OpenMP日益增加的复杂性使其学习门槛不断升高,本书回归OpenMP zui初的设计哲学,提炼出大多数程序员常用的21项核心知识——称为OpenMP“通用核心”,为零基础读者搭建了从通用核心到OpenMP多线程编程的高效学习阶梯。本书由OpenMP技术专家撰写,内容涵盖并行计算的核心设计模式、共享工作循环构造、OpenMP数据环境、OpenMP任务和OpenMP内存模型等内容,采用编程驱动的方式,借助复杂性逐渐提高的实例来逐步引入新概念。此外,本书网站ompcore.com为读者免费提供各类代码示例和练习题。

图书特色

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的参考指南,在OpenMP网站上可以找到该语言的参考指南,将其和OpenMP规范结合起来就能提供你所需要的信息。此外,也可以将Ruud van der Pas、Eric Stotzer和Christian Terboven[13]所著的Using OpenMP桾he Next Step这本优秀的书作为参考指南。
本书是关于如何学习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中使用最广泛的特性,并讲解如何有效地利用这些特性来解决一系列编程问题。这些知识非常实用,强烈推荐读者学习或参考。
——Barbara Chapman,石溪大学应用数学、统计和计算机科学教授

OpenMP API用于为各种并行系统编程,从基本的多核处理器到大型共享内存和异构系统的协处理器。要掌握OpenMP,你需要先掌握该语言的核心特性。本书基于作者20多年来讲授OpenMP的经验编写而成,是帮助读者打好基础的绝佳工具。
——Michael Klemm,OpenMP架构审查委员会CEO

这本书值得放在每一位OpenMP程序员的书架上。这不仅是初学者的必读之作,经验丰富的开发人员也会发现其价值所在。特别是关于内存模型的部分,对于这一最难掌握的内容,书中的讲解非常到位。
——Ruud van der Pas,Oracle杰出工程师,著有Using OpenMP—The Next Step

图书序言

我为OpenMP感到骄傲。自从我加入一个旨在创建OpenMP的并行程序员小团队以来,已经过去20多年了。今天,这门语言仍在茁壮成长,并深受广大程序员的欢迎。
然而,在OpenMP的世界里,并不是一切都很顺利。伴随着缓慢演变而增加的复杂度可能导致其“窒息”,而这种复杂度的增加常常困扰着成功的编程语言。为了适应新的硬件,新的功能会被添加到OpenMP中。当少数算法中出现了OpenMP难以处理的极端情况时,需要在熟悉的构造中加入新的子句。我们创建OpenMP时,有些没有考虑到的算法现在被认为是关键性的,于是又定义了新的构造(construct)。在经历了20年这样的过程之后,很难再看到简单的API—那些我们在1996年开始创建OpenMP时所设想的API。
通过这本书,我们返璞归真,回到创建OpenMP时的简约状态。增加复杂性是要有理由的。我们并不是要让OpenMP的进步倒退,而是要改变讲解OpenMP的方式。刚接触OpenMP的读者应该学习OpenMP中的一个小子集,这些内容在大多数程序中都会用到。只有掌握了这套通用的核心构造,才是时候去探索这门语言中更细微、更复杂的部分。
如果你是OpenMP的新手,这本书就是为你准备的,可以让你学习OpenMP的通用核心。有了这个基础,当你探索现代硬件上广泛的并行算法时,一切都是可能的。

Timothy G. Mattson
2019年5月

译者序

随着摩尔定律和丹纳德微缩定律的终结,在满足功耗约束的前提下,如何有效利用集成元器件成为摆在计算机体系结构设计者面前的重大挑战。多核化、以加速器为基础的处理器核心的异构化以及片上存储层次的多级化形成了多种多样的体系结构。诞生于集中式共享存储的对称多处理器模型下的OpenMP,也在不断变化和发展,从聚焦并行性的OpenMP 1.0~2.5,到聚焦不规则并行模式的OpenMP 3.0,再到应对多样化异构体系结构的OpenMP 4.0~5.0,OpenMP编程模型在不断演化,从一种支持简洁的并行编程模型的API,发展成一种庞大的跨平台兼容各种并行体系结构的复杂编程模型。这一变化使得OpenMP难以入门和应用。
面对这种现状,本书作者根据OpenMP规范的演变过程,以及OpenMP在实际应用案例中的特点,从OpenMP最初的设计哲学出发,梳理出必要且常用的OpenMP元素,构成OpenMP通用核心,帮助读者快速掌握基于OpenMP的多线程编程。本书按照循序渐进的学习思路安排素材,引导读者逐渐进入并行计算领域,了解性能指标和相关描述,并通过对OpenMP的主要组件和程序模型的介绍,使得读者快速了解多线程编程的精髓。本书强调动手实践,通过大量的实例和各类并行实现的对比,深入讲解OpenMP通用核心涉及的概念、构造和并行化编程方法,同时兼顾存储一致性模型等有助于读者理解原理的必要的底层思想。在此基础之上,引入更复杂、更现代的OpenMP编程要素,通过OpenMP系统化的术语、规范的介绍和各类网上资源,引导读者实现从入门到精通的跨越。
虽然译者一直在从事计算机体系结构和大规模并行计算方面的实践与科研工作,但限于水平,翻译中难免有错漏和瑕疵,恳请读者及同行批评指正,译者不胜感激。
最后,感谢家人和朋友的支持与帮助。同时,要感谢在本书翻译过程中做出贡献的人,特别是北京邮电大学曹凌婧、汪鑫、刘涛、张瑞涛、刘小萌和张涵等。还要感谢机械工业出版社的各位编辑,以及北京邮电大学计算机学院(国家示范性软件学院)的大力支持。

黄智濒
智能通信软件与多媒体北京市重点实验室
北京邮电大学计算智能与可视化实验室
2021年3月

图书目录

译者序
序言
前言
第一部分 做好学习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
3.1 OpenMP的历史 23
3.2 通用核心 25
3.3 OpenMP的主要组件 26
第二部分 OpenMP通用核心
第4章 线程和OpenMP编程模型 31
4.1 OpenMP概述 31
4.2 OpenMP 程序的结构 31
4.3 线程和fork-join模式 34
4.4 使用线程 38
4.4.1 SPMD设计模式 39
4.4.2 伪共享 43
4.4.3 同步 45
4.5 结束语 49
第5章 并行化循环 50
5.1 共享工作循环构造 51
5.2 组合式并行共享工作循环构造 53
5.3 归约 54
5.4 循环调度 56
5.4.1 静态调度 56
5.4.2 动态调度 57
5.4.3 选择一个调度 59
5.5 隐式栅栏和nowait子句 61
5.6 带有并行循环共享工作的Pi程序 63
5.7 一种循环级并行策略 64
5.8 结束语 66
第6章 OpenMP数据环境 67
6.1 缺省存储属性 68
6.2 修改存储属性 70
6.2.1 shared子句 70
6.2.2 private子句 72
6.2.3 firstprivate子句 73
6.2.4 default子句 74
6.3 数据环境的例子 74
6.3.1 数据作用域测试 75
6.3.2 曼德勃罗集的面积 76
6.3.3 重新审视Pi循环的例子 79
6.4 数组和指针 80
6.5 结束语 81
第7章 OpenMP任务 83
7.1 任务的必要性 83
7.2 显式任务 86
7.3 第一个例子:薛定谔程序 87
7.4 single构造 88
7.5 使用任务 89
7.5.1 什么时候任务完成 90
7.6 任务的数据环境 91
7.6.1 任务的缺省数据作用域 91
7.6.2 利用任务重新审视链表程序 93
7.7 利用任务的基础设计模式 93
7.7.1 分而治之模式 95
7.8 结束语 99
第8章 OpenMP内存模型 100
8.1 重新审视内存层次结构 101
8.2 OpenMP通用核心内存模型 103
8.3 使用共享内存 106
8.4 结束语 108
第9章 通用核心回顾 110
9.1 管理线程 111
9.2 共享工作构造 111
9.3 组合式并行共享工作循环构造 113
9.4 OpenMP任务 113
9.5 同步和内存一致性模型 114
9.6 数据环境子句 115
9.7 归约子句 116
9.8 环境变量和运行时库例程 117
第三部分 超越通用核心
第10章 超越通用核心的多线程 121
10.1 用于OpenMP通用核心构造的附加子句 121
10.1.1 并行构造 122
10.1.2 共享工作循环构造 124
10.1.3 任务构造 129
10.2 通用核心中缺失的多线程功能 133
10.2.1 threadprivate 133
10.2.2 master 135
10.2.3 atomic 136
10.2.4 OMP_STACKSIZE 137
10.2.5 运行时库例程 138
10.3 结束语 140
第11章 同步和OpenMP内存模型 141
11.1 内存一致性模型 142
11.2 成对同步 146
11.3 锁以及如何使用它 151
11.4 C++内存模型和OpenMP 153
11.5 结束语 156
第12章 超越OpenMP通用核心的硬件 157
12.1 非统一内存访问系统 158
12.1.1 在NUMA系统上工作 159
12.1.2 嵌套并行构造 168
12.1.3 检查线程亲和力 171
12.1.4 小结:线程亲和力和数据局部性 173
12.2 SIMD 173
12.3 设备构造 180
12.4 结束语 184
第13章 继续OpenMP的学习 186
13.1 来自ARB的程序员资源 186
13.2 如何阅读OpenMP规范 188
13.2.1 带有所有正式术语的OpenMP 188
13.3 OpenMP规范的结构 191
13.4 结束语 193
术语表 194

教学资源推荐
作者: (美)Peter S. Pacheco 著 旧金山大学
作者: [美]马克·艾伦·维斯(Mark Allen Weiss)著
作者: 贾春福 钟安鸣 杨骏 编著
作者: Nell Dale;John Lewis
参考读物推荐
作者: 华诚科技 编著
作者: (美)Vic (J.R.) Winkler 著
作者: 高扬 卫峥 尹会生 著 万娟 插画设计
作者: 章小莉等