1、1.1.1 什么是并行计算并行计算(parallel computing)是指,在并行机上,将一个应用分解成多个子任务,分配给不同的处理器,各个处理器之间相互协同,并行地执行子任务,从而达到加速求解速度,或者求解应用问题规模的目的。由此,为了成功开展并行计算,必须具备三个基本条件:(1) 并行机。并行机至少包含两台或两台以上处理机,这些处理机通过互连网络相互连接,互通信。(2) 应用问题必须具有并行度。也就是说,应用可以分解为多个子任务,这些子任务可以并行地执行。将一个应用分解为多个子任务的过程,称为并行算法的设计。(3) 并行编程。在并行机提供的并行编程环境上,具体实现并行算法,编制并行程序
2、,并运行该程序,从而达到并行求解应用问题的目的。1.1.2 并行计算的主要研究目标和内容对于具体的应用问题,采用并行计算技术的主要目的在于两个方面:(1) 加速求解问题的速度。(2) 提高求解问题的规模。当前,如图1.2 和图1.3 所示,组成并行机的三个要素为: 结点(node)。每个结点由多个处理器构成,可以直接输入输出(I/O)。 互联网络(interconnect network)。所有结点通过互联网络相互连接相互通信。 内存(memory)。内存由多个存储模块组成,这些模块可以如图1.2 所示,与结点对称地分布在互联网络的两侧,或者,如图1.3所示,位于各个结点的内部。并行编程模型5
3、.2 共享内存模型a) 在共享编程模型中,任务间共享统一的可以异步读写的地址空间。b) 共享内存的访问控制机制可能使用锁或信号量。c)这个模型的优点是对于程序员来说数据没有身份的区分,不需要特别清楚任务简单数据通信。程序开发也相应的得以简化。d)在性能上有个很突出的缺点是很难理解和管理数据的本地性问题。5.3 线程模型在并行编程的线程模型中,单个处理器可以有多个并行的执行路径。5.4 消息传递模型消息传递模型有以下三个特征:1 ) 计算时任务集可以用他们自己的内存。多任务可以在相同的物理处理器上,同时可以访问任意数量的处理器。2 ) 任务之间通过接收和发送消息来进行数据通信。3 ) 数据传输通
4、常需要每个处理器协调操作来完成。例如,发送操作有一个接受操作来配合。5.5 数据并行模型l 数据并行模型有以下特性:并行工作主要是操纵数据集。数据集一般都是像数组一样典型的通用的数据结构。任务集都使用相同的数据结构,但是,每个任务都有自己的数据。每个任务的工作都是相同的,例如,给每个数组元素加 4。l 在共享内存体系结构上,所有的任务都是在全局存储空间中访问数据。在分布式存储体系结构上数据都是从任务的本地存储空间中分离出来的。4.5 基于消息传递的并行计算环境在当前并行机上,比较流行的并行编程环境可以分为三类:消息传递、共享存储和数据并行,它们的典型代表、可移植性、并行粒度、并行操作方式、数据
5、存储模式、数据分配方式、学习难度、可扩展性等方面的比较在表4.5 中给出。由该表可以看出:(1) 共享存储并行编程基于线程级细粒度并行,仅被SMP 和DSM并行机所支持,可移植性不如消息传递并行编程。但是,由于它们支持数据的共享存储,所以并行编程的难度较小,但一般情形下,当处理机个数较多时,其并行性能明显不如消息传递编程。(2) 消息传递并行编程基于大粒度的进程级并行,具有最好的可移植性,几乎被当前流行的各类并行机所支持,且具有很好的可扩展性。但是,消息传递并行编程只能支持进程间的分布存储模式,即各个进程只能直接访问其局部内存空间,而对其他进程的局部内存空间的访问只能通过消息传递来实现。因此,
6、学习和使用消息传递并行编程的难度均大于共享存储和数据并行两种编程模式。表4.5 三种并行编程环境主要特征一览表特征 消息传递 共享存储 数据并行典型代表 MPI、PVM OpenMP HPF可移植性 所有流行并行机 SMPDSM SMPDSM MPP并行粒度 进程级大粒度 线程级细粒度 进程级细粒度并行操作方式 异步 异步 松散同步数据存储模式 分布式存储 共享存储 共享存储数据分配方式 显式 隐式 半隐式学习入门难度 较难 容易 偏易可扩展性 好 较差 一般本书的主要目的是全面介绍消息传递并行编程环境MPI,因此,在以后的篇幅中,将不再讨论共享存储和数据并行编程环境。4.5.1消息传递并行机
7、模型由于当前流行的各类SMP、DSM、MPP 和微机机群等并行机均支持消息传递并行程序设计,因此,有必要对这些具体并行机的体系结构进行抽象,设计一个理想的消息传递并行机模型。基于该模型,用户可以在不考虑具体并行机体系结构的条件下,组织消息传递并行程序设计,从而简化并行程序设计,增强程序的可移植性。 图4.1给出了一个理想的消息传递进程拓扑结构。其中,“P”表示MPI 进程,“M”表示每个进程的局部内存空间,多个“P/M”进程/ 内存模块通过互联网络相互连接,构成一个分布式存储的进程拓扑结构。在该结构中,各个进程之间可以直接通信,但是各个进程只能直接访问自身的局部内存空间,对其他进程的局部内存空
8、间的访问只能调用消息传递函数,通过进程间通信才能实现。因此,该进程拓扑结构的核心是连接进程的互联网络,也就是消息传递标准函数库,而构成该函数库的所有函数就构成了用户面对的消息传递并行编程环境。图4.1消息传递进程拓扑结构和并行机模型如果将图4.1 的每个P/M 模块替换成处理器,且规定每个处理器只能分配用户程序的一个进程,则所得的理想并行机模型就是消息传递并行机模型。不难看出,消息传递并行程序设计所依赖的并行机模型实际上属于典型的分布式存储并行机,且每台处理器只能分配用户程序的一个进程。基于该并行机模型,用户可以自由地调用消息传递函数库中的函数来组织具体的并行程序设计,且程序研制成功后,便可以
9、在任何支持该并行机模型隐含的进程拓扑结构的所有具体并行机上运行。这里,有必要说明的是,消息传递分布式存储并行机模型和具体并行机体系结构没有必然的联系。无论将该模型映射到何种类型的并行机(SMP、DSM、cluster、constellation、MPP),用户面对的都是该模型隐含的进程拓扑结构,只是各类具体并行机实现的消息传递函数库的方式不同,但用户无须知道这些细节。例如,在共享存储SMP、DSM 并行机中,消息传递是通过共享数据缓存区来实现的;在MPP 并行机中,消息传递是通过网络通信来实现的;在机群和星群并行机中,消息传递在SMP、DSM 并行机内部是通过共享数据缓存区实现的,而在SMP
10、、DSM 并行机之间是通过网络通信来实现的。因此,无论哪种类型的具体并行机,呈现在消息传递并行程序设计用户面前的必然是图4.1 所示的分布式存储并行机模型。4.5.2 标准消息传递界面MPI1994 年6 月,全球工业、政府和科研应用部门联合推出消息传递并行编程环境的标准用户界面(MPI ),它将消息传递并行编程环境分解为两个部分,第一是构成该环境的所有消息传递函数的标准接口说明,它们是根据并行应用程序对消息传递功能的不同要求而制定的,不考虑该函数能否具体实现;第二是各并行机厂商提供的对这些函数的具体实现。这样,用户只需学习MPI 库函数的标准接口,设计MPI 并行程序,便可在支持MPI 并行
11、编程环境的具体并行机上执行该程序。通常意义下所说的MPI 系统就是指所有这些具有标准接口说明的消息传递函数所构成的函数库。在标准串行程序设计语言(C、Fortran 、C+)的基础上,再加入实现进程间通信的MPI 消息传递库函数,就构成了MPI 并行程序设计所依赖的并行编程环境。MPI 吸收了众多消息传递系统的优点,例如P4、PVM、Express、PARMACS 等,是目前国内外最流行的并行编程环境之一。当前,大量工业、科学与工程计算部门(例如气象、石油、地震、空气动力学、核物理等)的科研与工程软件已经移植到MPI 平台。MPI是一个消息传递接口的标准,用于开发基于消息传递的并行程序,其目的
12、是为用户提供一个实际可用的、可移植的、高效的和灵活的消息传递接口。MPI这个名称包括三个方面的含义:(1) MPI是一个库,而不是一种语言。许多人认为 MPI是一种并行设计语言,这种看法并不准确。按照并行语言的分类,可以把Fortran+MPI、C+MPI看做是在原来的串行语言基础之上扩展而来的并行语言。MPI库可以和具体语言进行绑定,形成并行设计语言。从语法上说,C/C十 +和Fortran等语言对MPI库的调用规则,与调用一般的函数 /过程没有区别;(2) MPI是一种标准或者规范,而不特指某一个对它的具体实现。到目前为止,所有的并行计算机都提供对MPI的支持,用MPI书写的并行程序可以不
13、加修改的在所有并行机上运行;(3) MPI是一种消息传递编程模型,并且成为了这种编程模型的代表和事实上的标准。MPI库作为可移植的消息传递函数库,具有以下一些特点:(l) MPI提供缓冲区管理的函数,用户可以决定由系统对发送、接受缓冲区的管理,还是用户参与其管理,以便控制系统缓冲区空间,提高系统的安全性;(2) MPI不但支持语言本身所提供的各种结构,而且允许用户构造自己的复杂结构体和数据类型,使得进程间的通信更加便捷易用;(3) MPI为任务间的通信提供多种方式,大量的通信接口能够满足科学与工程算的需要;(4) MPI提供可靠的数据传输机制,发送的消息能够保证被对方正确接受,用户不必自行检查
14、传输错误、传输超时等。也就是说MPI的通信对用户而言是透明的;(5) MPI通过通信域保证通信的安全性,不同通信域内的并行任务之间的通信不会相互干扰和混淆;(6) MPI具有高度的可重构性,允许多个用户同时使用并行处理设备。由于MPI是一个库而不是一种语言,因此MPI必须和某个语言结合起来才能使用,这称之为MPI的语言绑定。MPI 1.0 版于 1994 年推出,并同时获得了各并行机产商的具体实现;MPI 2.0 版于1998 年10 月推出,它在1.0 版的基础上,增加了如下的消息传递功能:(1)并行I/O :允许多个进程同时读/ 写同一个文件;(2)线程安全:允许MPI 进程的多个线程执行,即支持与OpenMP 的混合并行编程;(3)动态进程管理:允许并行应用程序在执行过程中,动态地增加和删除进程个数;(4)单边通信:允许某个进程对其他进程的局部内存单元直接执行读/写访问,而不需要对方进程的显式干预;(5)并行应用程序之间的动态互操作:允许各个MPI 并行应用程序之间动态地建立和删除消息传递通信通道。