新書推薦:
《
一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作)
》
售價:HK$
54.9
《
重写晚明史(全5册 精装)
》
售價:HK$
781.8
《
汉末晋初之际政治研究
》
售價:HK$
132.2
《
强者破局:资治通鉴成事之道
》
售價:HK$
80.6
《
鸣沙丛书·鼎革:南北议和与清帝退位
》
售價:HK$
121.0
《
从康德到黑格尔的发展:兼论宗教哲学(英国观念论名著译丛)
》
售價:HK$
60.5
《
突破不可能:用特工思维提升领导力
》
售價:HK$
77.3
《
王阳明大传:知行合一的心学智慧(精装典藏版)
》
售價:HK$
221.8
|
內容簡介: |
OpenMP日益增加的复杂性使其学习门槛不断升高,本书回归OpenMP 最初的设计哲学,提炼出大多数程序员常用的21项核心知识——称为OpenMP“通用核心”,为零基础读者搭建了从通用核心到OpenMP多线程编程的高效学习阶梯。本书由OpenMP技术专家撰写,内容涵盖并行计算的核心设计模式、共享工作循环构造、OpenMP数据环境、OpenMP任务和OpenMP内存模型等内容,采用编程驱动的方式,借助复杂性逐渐提高的实例来逐步引入新概念。此外,本书网站ompcore.com为读者免费提供各类代码示例和练习题。
|
目錄:
|
译者序
序言
前言
部分 做好学习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章 什么是OpenMP23
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 threadprivate133
10.2.2 master135
10.2.3 atomic136
10.2.4 OMP_STACKSIZE137
10.2.5 运行时库例程138
10.3 结束语140
第11章 同步和OpenMP内存模型141
11.1 内存一致性模型142
11.2 成对同步146
11.3 锁以及如何使用它151
11.4 C 内存模型和OpenMP153
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 SIMD173
12.3 设备构造180
12.4 结束语184
第13章 继续OpenMP的学习186
13.1 来自ARB的程序员资源186
13.2 如何阅读OpenMP规范188
13.2.1 带有所有正式术语的OpenMP188
13.3 OpenMP规范的结构191
13.4 结束语193
术语表194
|
內容試閱:
|
本书不是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程序员,以及过去使用过我们的教程的所有学生。没有他们,我们不可能创作出这样的书。
|
|