基本信息
- 原书名:Programming Models for Parallel Computing

内容简介
计算机书籍
本书以使用说明的形式对当今主流的并行编程模型进行了详细描述,内容包括分布式内存架构上最常见的MPI(消息传递接口)编程模型;单边通信模型,范围从低层的运行时库(GASNet、 OpenSHMEM)到高层的编程模型(UPC、 GA、Chapel);面向任务的编程模型,包括Charm++、ADLB、Scioto、Swift、CnC;面向节点内并行(多核架构以及附带加速器)的并行编程模型,包括OpenMP、Cilk Plus、TBB、 CUDA以及OpenCL。每章配备大量应用和程序示例,可以使读者很好地理解各种编程模型所提供的功能及特点。
本书可作为高等院校并行编程课程的研究生教材,也可作为具有一定并行编程经验的软件开发人员、科研人员以及任何与数据集及大规模计算打交道的科学家的参考资料。
目录
译者序
前言
第1章 消息传递接口 1
1.1 引言 1
1.2 MPI基础 1
1.3 点对点通信 2
1.4 数据类型 3
1.5 非阻塞式通信 4
1.6 聚合通信 5
1.7 单边通信 7
1.8 并行I/O 9
1.9 其他特性 11
1.10 MPI开发心得 12
1.11 总结 13
第2章 全局地址空间网络 14
2.1 研究背景与动机 14
2.2 GASNet概述 14
2.2.1 相关术语 15
2.2.2 线程 15
译者序
本书内容涵盖了当前流行的并行编程模型。针对不同的并行计算机体系结构以及不同的并行应用程序特点,本书深入浅出地介绍了与之对应的并行编程模型。书中首先对适用于分布式内存架构的并行编程模型进行了介绍,包括最为常用的MPI编程模型,以及GASNet、OpenSHMEM、UPC、GA、Chapel等单边通信编程模型;然后面向非规则应用程序,对任务并行编程模型进行了讲解,包括Charm++、ADLB、Scioto、Swift以及CnC编程模型;之后面向节点内多核处理器架构,对OpenMP、Cilk Plus、TBB三种多线程编程模型进行了综述;最后面向异构众核架构,对比了CUDA及OpenCL两种大规模轻量级线程编程模型。本书不仅详细介绍了各种编程模型的特点及使用方法,同时也详细讨论了编程模型的实现细节及关键优化技术,从而帮助读者深入理解并行程序的后台运行原理。此外,本书配备大量应用和程序实例,方便读者掌握相关技巧。总之,本书作者根据自己多年的实际并行编程经验,从程序员的角度思考并行编程模型的本质,并以一种职业程序员易于掌握的方式对最为关键的基本知识和技术进行了细致讲解。本书可作为并行编程的入门材料,也可为具有一定并行编程经验的软件开发人员提供参考,提升并行程序的开发效率。
由于时间仓促,而且书中某些术语目前没有统一译法,所以我们对一些术语采取了保留其英文名称的方法。译文的错误和不妥之处,恳请广大读者不吝批评指正。
前言
随着并行计算技术的发展,计算机科学领域的专家将研究重点转移到能够适应高性能并行计算和超级计算系统的编程模型设计方向。并行编程模型包含执行模型(选择代码执行路径)和内存模型(管理计算节点间和节点内的数据流)。多核计算需要并发计算和移动数据,这增加了程序运行结果和性能的不确定性,导致并行编程模型变得更加复杂。
从技术上分析,编程模型和编程系统间存在一定区别。编程模型是一种编程方式,例如采用大量同步或者隐含编译器协助的并行化方式,而编程系统指程序员编写程序时实际使用的系统抽象接口。随着时间推移,编程模型和编程系统间的区别逐渐变得模糊。目前,编程模型既是一种编程方式,也是模型实例化过程中所使用的系统抽象接口。
与通用的编程模型设计不同,在大多数并行系统中,程序开发人员往往不采用单一的并行编程模型。不同的开发人员会选择不同层次的虚拟化方式,并在高效性、移植性、高性能和通用性四种编程模型特性中选择不同的组合。针对面向终端的程序开发应用,具体研究领域的科学家通常倾向于选择更高效和高级别的编程模型,即使该编程模型只能针对特定的算法而缺乏通用性。针对编程语言和函数库,程序开发者一般更倾向于选择高性能和低级别的编程模型,即使该编程模型具有较高的使用难度。然而,针对面向终端的程序应用以及编程语言和函数库开发,上述编程模型选择并非是绝对的,可根据实际的开发应用情况进行调整。
关于本书
本书对当今高性能计算以及超级计算系统上的几种最主要的并行编程模型进行了概述。书中包含多种并行编程模型,它们拥有不同的生产效率、可移植性、性能以及表达范围。因此,读者可以学习和理解每种编程模型提供了哪些折中。
第1章讨论了消息传递接口(MPI)。MPI是当今面向分布式内存计算的最重要的并行编程模型。该章对MPI最常用的功能进行了概述,并涉及MPI标准的第三个主要版本 ——MPI-3。
第2~5章从低层次的运行时库到高层次的编程模型,对单边通信模型进行了讨论。第2章介绍了全局地址空间网络(GASNet),它是一种低层次的编程模型,用于多种分区全局地址空间(PGAS)模型的一种通用可移植运行时系统。第3章讨论了OpenSHMEM单边通信库,它用于向用户直接呈现本地硬件通信功能。OpenSHMEM通过扩展库的形式模拟了许多PGAS模型的功能,这样做的好处是不依赖于语言扩展及相应的编译器支持。第4章提供了Unified Parallel C(UPC)编程模型的概述。UPC是基于C语言的PGAS模型,它为全局地址空间内存的创建与管理提供了相应的语言扩展及库接口。第5章介绍了全局数组(GA),与OpenSHMEM类似,GA是另一种基于库的单边通信模型。但GA基于多维数组提供了更高层次的抽象,以方便用户编程。
第6章讨论了Chapel。它是一种高生产率编程模型,支持以任务并行及数据并行两种方式对应用进行描述。Chapel同时也具有一级语言概念,可对局部性进行描述与推理,这与它支持的并行特性是互不相关的。
第7~11章展示了面向任务的编程模型,它们允许用户以任务的方式描述计算及数据单元,并允许运行时系统来管理计算以及必要的数据移动。第7章对Charm++编程模型进行了讨论。Charm++提供了一种依赖于工作过分解的抽象模型,以在可用的计算单元间动态地管理任务。第8章深入讨论了异步动态负载均衡(ADLB)库,它提供了另一种面向任务的工作共享方法,并以MPI作为低层次的通信模型。第9章讨论了可扩展任务对象集合(Scioto)编程模型,它依赖于类似PGAS的单边通信框架来实现基于工作窃取的负载均衡。第10章描述了Swift,它是一种高层次的脚本语言,允许用户使用高层次语义对计算进行描述,并在内部将其翻译成其他面向任务的编程模型,如ADLB。第11章描述了并行集(CnC),它是一种高层次的声明式模型,允许用户将应用描述为由相互通信的内核构成的图。
第12~16章展示了面向节点内并行的编程模型,涉及的硬件环境包括多核架构、加速器以及两者同时存在的情况。第12章讨论了OpenMP。OpenMP是当今科学计算领域最重要的节点内并行编程模型。该章介绍了OpenMP的进化历程以及核心特性,并涉及OpenMP 4.0。第13章讨论了Cilk Plus编程模型,它是一种对C及C++语言的并行扩展,用于在现代共享内存多核机器上开发规则以及非规则并行。第14章讨论了Intel TBB(Threading Building Block),它是一个基于C++模板类实现的库。与Cilk Plus类似,TBB支持共享内存多核架构上的并行执行。第15章讨论了NVIDIA提供的CUDA(Compute Unified Device Architecture)编程模型。CUDA通过单指令多线程块运行方式来支持NVIDIA图形处理单元上的并行计算。尽管CUDA是NVIDIA设备上的专有编程模型,但CUDA在并行编程社区中具有广泛影响力,并在应用中得到广泛使用,因此第15章对CUDA进行了讨论。第16章描述了OpenCL(Open Computing Language)模型,它提供了一个低层次的、平台无关的编程模型,可以在不同异构架构上进行编程,其中包括图形处理单元。
本书对不同编程模型的讲解方式在其他书籍中是很少见的。尤其是通过使用说明的方式来展示材料,而不是以更正式的类似于研究论文的方式展示。本书不是一个致力于详细描述每个编程模型语法及语义的参考手册。本书的目标是描述使用这些模型进行并行编程的通用方法,以及每种方法所实现的目标。不过,本书提供了一些模型所提供的核心接口的语法及语义定义,我们将这些定义作为编程模型所提供抽象的例子。提供这些定义的目的是提高内容的可读性。这些定义并不一定是最重要的或最常用的接口,而只是作为例子说明如何使用该编程模型。
致谢
首先感谢对本书不同章节做出贡献的所有作者:
William D. Gropp,伊利诺伊大学厄巴纳-香槟分校
Rajeev Thakur,阿贡国家实验室
Paul Hargrove,劳伦斯伯克利国家实验室
Jeffery A. Kuehn,橡树岭国家实验室
Stephen W. Poole,橡树岭国家实验室
Kathy Yelick,加州大学伯克利分校,劳伦斯伯克利国家实验室