MPI并行程序设计MPI(MessagePassingInterface)是目前最重要的一种并行编程工具和环境,几乎所有重要的并行计算机厂商都提供对它的支持,MPI将功能、高效和移植性三个重要而又有一定矛盾的方面很好地融为一体,这是MPI能够取得成功的重要原因。课程简介通过此门课程的学习可以使学生了解如何使用MPI进行并行程序设计,此课程既包括最基本的MPI并行程序设计的编写方法,又通过丰富的实例介绍了如何通过MPI的高级特征来编写更复杂的、更具有通用性和移植性的并行程序。具有C或FORTRAN编程经验的程序员都可以掌握本课程的内容。此外本课程还根据大量的实践经验,介绍了如何在Linux以及NT操作系统上安装、编译和运行MPI并行程序,从而使课程内容更具有实用性。学习目标通过本课程的学习,使学生可以对并行程序设计有一个具体的基本的概念,对MPI有比较全面的了解,掌握MPI的基本功能,并且可以编写基本的MPI程序,可以用MPI来解决实际的比较基本的并行计算问题。难重点本课程的难点之一是从串行求解和串行程序设计向并行求解和并行程序设计的转变,难点之二是MPI的调用形式很多,学习负担较重,难点之三是MPI的各种形式的组调用。重点首先是树立并行求解和并行程序设计的基本概念,然后是基本的、简单的但是又是非常重要的MPI子集,它是学习MPI程序设计的基础,最后是关于MPI基本的数据类型的定义和使用、虚拟进程拓扑地定义和使用以及基本的组调用操作。第一章并行计算机课前索引1、学习目标对并行程序设计和运行的硬件基础――并行计算机有一个基本的总体了解,为并行程序设计建立基础。本章不要求对并行计算机有特别深入、具体和细致的了解,重要的是把握并行计算机的基本特征。2、重点和难点并行计算机的定义、分类和特点。关于什么样的计算机才是并行计算机这一问题其实没有一个统一的定义和标准,不同的定义反映了不同的学术观点,也给出了不同的分类方法,给出的特点也就不同,本章讲述最常见的定义和分类方法。第一节:并行计算机的分类本节知识点:•SIMD/MIMD/SPMD/MPMD并行计算机•共享内存与分布式内存并行计算机•SIMD/MIMD并行计算机SIMD/MIMD并行计算机指令和数据是计算机解决问题所涉及到的两个基本方面,即让计算机执行什么样的操作和对什么对象执行相应的操作,虽然现在计算机有了很大的发展,但他们仍然有重要的地位和作用,这也是为什么指令数据的划分方式至今仍在使用的重要原因。不管是同时执行多条指令,还是同时处理多个数据,具有这样功能的计算机都可以称为并行计算机。根据一个并行计算机能够同时执行的指令与处理数据的多少,可以把并行计算机分为SIMD(Single-InstructionMultiple-Data)单指令多数据并行计算机和MIMD(Multiple-InstructionMultiple-Data)多指令多数据并行计算机。按同时执行1条指令还是多条指令,同时处理一个数据还是多个数据进行组合,便可以得到四种对计算机的划分方式,但是MISD这种组合在实际中并不存在,而其它的三种组合都有对应的计算机实现。SIMD计算机同时用相同的指令对不同的数据进行操作,比如对于数组赋值运算A=A+1在SIMD并行机上可以用加法指令同时对数组A的所有元素实现加1。即数组(或向量)运算特别适合在SIMD并行计算机上执行,SIMD并行机可以对这种运算形式进行直接地支持,高效地实现。MIMD计算机同时有多条指令对不同的数据进行操作,比如对于算术表达式A=B+C+D-E+F*G可以转换为A=(B+C)+(D-E)+(F*G)加法(B+C),减法(D-E),乘法(F*G)如果有相应的直接执行部件,则这三个不同的计算可以同时进行。SIMD和MIMD这种表达方法虽然至今还在广泛使用,但是,随着新的并行计算机组织方式的产生,比照上面的划分方法,人们按同时执行的程序和数据的不同,又提出了SPMD(Single-ProgramMultuple-Data)单程序多数据并行计算机和MPMD(Multiple-ProgramMultiple-Data)多程序多数据并行计算机的概念。SPMD/MPMD并行计算机如果一个程序的功能就是为一个矩形网格内的不同面片涂上相同的颜色,则对于一个划分得很细的特大矩形面片,可以将它划分为互不交叉的几个部分,每一部分都用相同的程序进行着色。SPMD并行计算机可以很自然地实现类似的计算。一般地,SPMD并行计算机是由多个地位相同的计算机或处理器组成的,而MPMD并行计算机内计算机或处理器的地位是不同的,根据分工的不同,它们擅长完成的工作也不同,因此,可以根据需要将不同的程序(任务)放到MPMD并行计算机上执行,使得这些程序协调一致地完成给定的工作。共享内存与分布式内存并行计算机从物理划分上,共享内存和分布式内存是两种基本的并行计算机存储方式,除此之外,分布式共享内存也是一种越来越重要的并行计算机存储方式。存储问题在计算机中的地位越来越重要,现在计算机的性能在很大程度上决定于存储器,而且新型的计算机有可能采用以存储器为中心而不是传统的以处理器为中心。共享内存的并行计算机在编程上相对简单,容易使用,但是它有一个重要的缺点就是扩展性较差,不可能有太多的处理器共用相同的存储器,这样由于一致性访问和读写冲突等问题会引起计算效率的降低。对于分布式内存的并行计算机,其扩展性较好,增加更多的处理器引起的问题不会象共享内存一样突出,但是在这样的计算机上编写并行程序相对较难。共享内存的并行计算机对于共享内存的并行计算机,各个处理单元通过对共享内存的访问来交换信息、协调各处理器对并行任务的处理。对这种共享内存的编程,实现起来相对简单,但共享内存往往成为性能特别是扩展性的重要瓶颈。分布式内存的并行计算机对于分布式内存的并行计算机,各个处理单元都拥有自己独立的局部存储器,由于不存在公共可用的存储单元,因此各个处理器之间通过消息传递来交换信息,协调和控制各个处理器的执行。本书介绍的消息传递并行编程模型所面对的并行计算机的存储方式。不难看出,通信对分布式内存并行计算机的性能有重要的影响,复杂的消息传递语句的编写成为在这种并行计算机上进行并行程序设计的难点所在,但是,对于这种类型的并行计算机,由于它有很好的扩展性和很高的性能,因此,它的应用非常广泛。分布式共享内存的并行计算机分布式共享内存的并行计算机结合了前两者的特点,是当今新一代并行计算机的一种重要发展方向。对于目前越来越流行的机群计算(ClusterComputing),大多采用这种形式的结构。通过提高一个局部结点内的计算能力,使它成为所谓的超结点,不仅提高了整个系统的计算能力,而且可以提高系统的模块性和扩展性,有利于快速构造超大型的计算系统。第二节:解决实际问题的一般模式用并行计算机来解决问题就是将现实世界的问题(物理问题)转换为计算机能够识别的形式,经过处理以后,在转换为现实世界中结果的表达形式。这种相互转换的过程需要建立模型,需要进行问题化简的同时保留问题的本质,同时考虑问题求解的效率。问题映射一个物理问题并行求解的最终目的是将该问题映射到并行机上,这一物理上的映射是通过不同层次上的抽象映射来实现的。计算模型忽略并行机的非本质的细节特征,可以得到该并行机的并行计算模型,在这一模型上,可以设计各种适合该模型的并行算法,这些算法精确描述了该并行模型能够实现的功能,而这些算法是通过用特定的并行语言设计并行程序后得以实现的。对于现实世界的物理问题,为了能够高效地并行求解,必须建立它的并行求解模型,一个串行的求解模型是很难在并行机上取得满意的并行效果的。有了并行求解模型,就可以针对该模型设计高效的并行算法,这样就可以对该问题的求解进行精确描述和定量分析,就可以对各种不同的算法进行性能上的比较,最后通过并行程序设计,实现问题和并行机的结合。并行程序设计并行程序设计,需要将问题的并行求解算法转化为特定的适合并行计算模型的并行算法,为了达到这一目的,首先是问题的并行求解算法必须能够将问题内在的并行特征充分体现出来,否则并行求解算法将无法利用这些并行特征,从而使问题的高效并行求解成为不可能;其次是并行求解模型要和并行计算模型尽量吻合,这样,就为问题向并行机上的高效解决提供了前提。小结本章介绍了并行计算机的一般分类方法和在并行计算机上解决问题的一般步骤,通过这章的学习,希望大家对并行计算机和如何在并行计算机上解决问题有一个宏观的总体上的了解,树立并行解决问题的概念。并行编程模型与并行语言学习目标并行程序的编程模型虽然有许多种,但本章只要求掌握最基本的两种并行编程模型及其特点;对于并行编程语言要求掌握并行语言的几种产生方式和特点,不要求掌握具体的并行语言。重点和难点并行编程模型的掌握是难点,其精髓还需要经过实际的编程实践后才能够准确把握,如何用合适的并行模型和并行语言高效解决给定的问题是本章的重点。并行编程模型目前最重要的并行编程模型是数据并行和消息传递,数据并行编程模型的编程级别比较高,编程相对简单,但它仅适用于数据并行问题;消息传递编程模型的编程级别相对较低,但消息传递编程模型可以有更广泛的应用范围。数据并行编程模型数据并行即将相同的操作同时作用于不同的数据,数据并行编程模型提供给编程者一个全局的地址空间,一般这种形式的语言本身就提供并行执行的语义,因此对于编程者来说,只需要简单地指明执行什么样的并行操作和并行操作的对象,就实现了数据并行的编程比如对于数组运算,使得数组B和C的对应元素相加后送给A,则通过语句A=B+C(或其它的表达方式)能够实现上述功能,使并行机对B、C的对应元素并行相加,并将结果并行赋给A。因此数据并行的表达是相对简单和简洁的,它不需要编程者关心并行机是如何对该操作进行并行执行的。消息传递并行编程模型消息传递即各个并行执行的部分之间通过传递消息来交换信息、协调步伐、控制执行。消息传递一般是面向分布式内存的,但是它也可适用于共享内存的并行机消息传递为编程者提供了更灵活的控制手段和表达并行的方法,一些用数据并行方法很难表达的并行算法,都可以用消息传递模型来实现,灵活性和控制手段的多样化,是消息传递并行程序能提供高的执行效率的重要原因。消息传递模型一方面为编程者提供了灵活性,另一方面,它也将各个并行执行部分之间复杂的信息交换和协调、控制的任务交给了编程者,这在一定程度上增加了编程者的负担,这也是消息传递编程模型编程级别低的主要原因。虽然如此,消息传递的基本通信模式是简单和清楚的,学习和掌握这些部分并不困难,因此目前大量的并行程序设计仍然是消息传递并行编程模式。数据并行与消息传递并行编程模型的对比数据并行与消息传递并行编程模型不同的并行编程模型也就是不同的通过并行程序解决问题的模式,数据并行的主要特征是以数据为中心,通过对数据的划分和并行处理来解决问题,消息传递当然也可以实现上述功能,但是消息传递在问题的表述上更具体,更低级,可以解决的问题相对于数据并行模型来说也更广泛。在一定程度上,可以把数据并行看作是消息传递的特殊形式。并行语言产生的几种方式1、设计全新的并行语言;2、扩展原来的串行语言的语法成分,使它支持并行特征;3、不改变串行语言,仅为串行语言提供可调用的并行库。设计全新的并行语言设计一种全新的并行语言的优点是可以完全摆脱串行语言的束缚,从语言成分上直接支持并行,这样就可以使并行程序的书写更方便,更自然,相应的并行程序也更容易在并行机上实现。设计全新的并行语言,实现起来难度和工作量都很大,目前还没有一个统一的标准可以遵循。第二节:并行语言扩充串行语言一种重要的对串行语言的扩充方式就是标注,即将对串行语言的并行扩充作为原来串行语言的注释。对于这样的并行程序,若用原来的串行编译器来编译,标注的并行扩充部分将不起作用,仍将该程序作为一般的串行程序处理,若使用扩充后的并行编译器来编译,则该并行编译器就会根据标注的要求,将原来串行执行的部分转化为并行执行。对串行语言的并行扩充,相对于设计全新的并行语言,显然难度有所降低,但