超性能计算(mpi)ppt课件详解_第1页
超性能计算(mpi)ppt课件详解_第2页
超性能计算(mpi)ppt课件详解_第3页
超性能计算(mpi)ppt课件详解_第4页
超性能计算(mpi)ppt课件详解_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高性能计算程序设计课程内容 并行计算机与并行算法的基础知识 MPI程序设计 OpenMP程序设计目的: 了解和掌握基本的高性能程序设计编程技术。参考资料高性能计算并行编程技术MPI并行程序设计 都志辉 清华大学出版社并行算法实践 阵国良等 高等教育出版社并行计算-结构、算法、编程 阵国良等 高等教育出版社第一讲 基础知识 2014.9.16一 高性能计算的定义高性能计算指同时对多项任务或多条指令或多个数据进行处理的一种方法同意词:并行计算,超级计算高性能计算的目的 提供比传统计算机更快的计算速度 解决传统计算机无法解决的问题二、什么叫高性能计算机? 完成并行处理的计算机系统称为并行计算机(高性

2、能计算机),它是将多个(几个、几十个,几千个,上万个)处理器通过网络连结以一定的方式有序地组织起来形成的一种特殊的计算机(计算机集群)。 连接方式涉及网络之间的互联拓扑、通信协议等 有序组织涉及操作系统、中间软件等并行计算机示例并行计算机示例并行计算机示例Berkeley于1994年开发的集群式系统并行计算机示例国内独立研制的第一套大规模并行机系统曙光1000并行计算机示例IBM 建造的世界上最大的并行计算中心,用于美国能源部的核试验计算系统共有15台曙光W580双路服务器,CPU整体峰值性能达到3.312万亿次/秒。每台计算节点配置2颗IntelXEON E5-2630 2.3G 6C CP

3、U六核CPU,24G DDR3内存。GPGPU计算系统共有7台曙光W580I,GPU双精度浮点峰值达到9.17万亿次/秒。每台GPGPU计算节点配置2块Nvidia K20 GPGPU卡。系统配备1台管理/IO/登陆节点,存储裸容量为2.3TB,部署曙光Gridview 2.6集群管理系统,用户可通过IP地址实现Web访问。系统配置机房环境管理节点1台,部署曙光IMMS机房环境管理系统。用户可通过IP地址实现Web访问。系统配置1套线速互联的56Gb FDR Infiniband网络。系统共用9个服务器机柜、1个空调机柜、4个航空电源箱供电,系统峰值功耗约为28kW。三、为什么要建造高性能计算

4、机?一、许多问题串行计算机难以解决核试验,地球物理资料处理,天气预报等二、计算速度的要求串行速度提升缓慢;需要在更短的时间内解决相同的问题;三、问题的规模不断扩大 物理现象的仿真模拟(一维 二维 三维) 长期天气预报 更为复杂的科学研究四、对计算结果的精确性的要求不断提高动物的食物链高性能计算机主要解决两类问题一、常规串行机不能解决的问题二、常规机器能够解决,但速度很慢的问题四、高性能(并行)计算机的发展历史及趋势 20世纪70年代末,向量机的出现标志着超级计算机的开始计算速度:提高了一个数量级提高计算速度的途径:改进芯片技术,提供共享存储多处理器系统 20世纪80年代后期,共享存储方式的大规

5、模并行计算机蓬勃发展,超大规模并行机出现 贵族计算机 近年来,集群式系统由于具有以下优点而得到了快速发展 低成本、高性能、短周期,大规模并行,分布式共享内存 平民的超级计算机发展历史 向量机(芯片级的并行计算机) MPP(Massively Parallel Processors)(主板级的并行计算机) Cluster研制难度逐渐降底发展趋势: 集群式系统将成为并行机的发展主流 原因:1、传统向量机与共享内存计算机的计算速度很难突破物理极限2、大型计算机价格昂贵,削弱了其市场竞争力3、操作困难,缺乏一个统一的标准4、其它诸多原因国内的超级计算中心 国家高性能计算中心(北京,合肥,成都,武汉,上

6、海,杭州,西安) 山东大学高性能计算中心 天津高性能计算中心 北京应用物理与计算数学研究所- 高性能计算中心 上海超级计算中心 中国科学院的超级计算中心五、高性能计算(机)的应用1、理论科学2、实验科学3、计算科学计算流体力学、计算力学、计算分子动力学、计算生物学、计算化学、计算气象学、计算材料学、计算物理学、计算电子学、计算量子力学、 中长期天气预报。每增加一天,要求计算速度增加一个数量级。 信息战。关键是对信息的处理速度,如雷达信息的处理 地震预报预测 石油勘测 生物信息处理 .六、并行计算机的分类指令与数据:SIMD(Single-Instruction Multiple-Data),同

7、时用相同的指令对不同的数据进行操作MIMD(Multiple-Instruction Multiple-Data),同时有多条指令对不同的数据进行操作SPMD(Single-Program Multuple-Data),同时执行相同的程序对不同数据操作MPMD(Multiple-Program Multuple-Data),同时有多个程序对不同的数据进行操作存储方式:共享内存 处理单元通过对共享内存的访问来交换信息协调各处理器对并行任务的处理。分布式内存 各个处理单元拥有独立的局部存储器,处理器之间通过消息传递来交换信息,协调和控制各个处理器的执行。分布式共享内存 结合前两者特点,提高了整个系

8、统的计算能力而且可以提高系统的模块性和扩展性,有利于快速构造超大型的计算系统七、并行算法及分类 算法是解题的精确描述 -是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。并行计算是可同时求解的诸进程的集合,这些进程相互作用和协调动作,并最终获得问题的求解。 并行算法就是对并行计算过程的精确描述 并行算法可以从不同的角度分类为: -数值计算并行算法和非数值计算并行算法 -同步并行算法和异步并行算法 -共享存储并行算法和分布存储并行算法数值计算并行算法和非数值计算并行算法数值计算是指基于代数关系运算的计算问题 -如矩阵运算,多项式求根,线性代数方程组的求解等 -科学与工程中的计算问题如计

9、算力学,计算物理,计算化学等一般为数值计算问题非数值计算是指基于比较关系的运算问题 -诸如排序、选择、搜索、匹配等符号处理 -在符号类的信息处理中获得广泛应用,如数据库领域的计算问题,海量数据挖掘,生物信息学等同步并行计算和异步并行计算同步并行计算:参与并行计算的各个进程必须在相同的时刻执行至某一位置,此时较先到达该点的进程必须等待其它进程均已到达该位置才向下执行 大多数工程计算所采用并行计算方式 并行化程度较低异步并行计算:各进程独立运行,互不干涉 并行化程度较高同步并行计算异步并行计算共享存储并行算法和分布存储并行算法适用于不同的机器 划分(Partitioning) 划分计算与数据,开拓

10、并行机会 通信(Commutication) 计算之间数据共享,任务协调 组合(Agglomeration) 合理组织各任务来提高性能 映射(Mapping)分配任务(分布式、共享)分配给不同处理器的任务量应当均衡,不同处理器交互应当最少八、PCAM并行算法设计过程九 MPI简介 并行语言的产生方式 MPI并行编程1、 并行语言的产生方式设计全新的并行语言改变串行语言的语法,使其支持并行编程不改变串行语言的语法,仅为串行语言提供并行库目前较常用的并行编程语言: PVM DPF OpenMP MPI共同特点: 公用软件, 易于得到 多数厂家支持消息传递的特点: 在消息传递模型中, 一个并行应用由

11、一组进程组成, 每个进程的代码是本地的, 只能访问私有数据, 进程之间通过传递消息实现数据共享和进程同步. 优点: 用户可以对并行性的开发、数据分布和通信实现完全控制. 缺点: 要求程序员显式地处理通信问题, 如, 消息传递调用的位置, 数据移动, 数据复制, 数据操作, 数据的一致性等等. 对大多数科学计算程序来说, 消息传递模型的真正困难还在于显式的域分解, 也就是说, 将对相应数据的操作限定在指定的处理器上进行, 在每个处理器上只能看见整个分布数据的一部分. 无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来. 大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一次性实

12、现, 而共享存储方法允许在现有的串行代码中插入并行说明从而实现逐步转换.与之相比, 这是消息传递的一个明显的缺点. 2、 MPI并行编程MPI:Message Passing Interface当前应用最为广泛的并行编程工具是一个库而不是一门语言是一种标准或规范的代表而不特指某一个对它的具体实现是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准什么是MPI?MPI的三个主要目的 1 较高的通信性能; 2 较好的程序可移植性; 3 强大的功能。 提供应用程序编程接口。 提高通信效率。措施包括避免存储器到存储器的多次重复拷贝,允许计算和通信的重叠等。 可在异构环境下提供实现。 提供的接

13、口可以方便 C 语言和 Fortran 77的调用。 提供可靠的通信接口。即用户不必处理通信失败。 定义的接口和现在已有接口(如PVM)差别不能太大,但是允许扩展以提供更大的灵活性。 定义的接口能在基本的通信和系统软件无重大改变时,在许多并行计算机生产商的平台上实现。接口的语义是独立于语言的。 接口设计应是线程安全的。3、MPI的产生与发展4、MPI的语言绑定 MPI不是一门语言,而是一个库,必须和特定的语言绑定才能进行MPI_I:C、FORTRAN77MPI_II:C+、FORTRAN905、目前MPI的主要实现 MPICH: 美国的Argonne国家实验室 /mpi/mpich CHIMP

14、: 爱丁堡大学的并行计算中心 ftp:/ftp.epcc.ed.ac.uk/pub/packages/chimp LAM(Local Area Multicomputer): 俄亥俄州立大学 /lam/download 较强的通信功能 较高的可移置性 与最常用的编译器实现的绑定 免费,源代码开放6、MPI的特点十、 第一个MPI程序 MPI程序的框架结构 第一个MPI程序 并行程序的运行方式 MPI程序的惯例MPI程序的框架结构头文件包含MPI库相关变量的声明定义与通信有关的变量程序开始调用MPI初始化函数程序结束调用MPI结束函数 程序体计算与通信调用MPI其它函数#include void

15、 main(int argc, char *argv) printf(“hello world!n”);用串行的C语言实现“hello world”第三部分第五部分第一部分用C+MPI实现hello world!#include mpi.h#include #include void main(int argc,char* argv) int myid, numprocs namelen; char processor_nameMPI_MAX_PROCESSOR_NAME; MPI_Init(&argc,&argv);/*程序初始化*/ MPI_Comm_rank(MPI_COMM_WORLD

16、,&myid); /*得到当前进程号*/MPI_Comm_size(MPI_COMM_WORLD,&numprocs); /*得到总的进程数*/MPI_Get_processor_name(processor_name,&namelen); /*得到机器名*/printf(“hello world! Process %d of %d on %sn, myid, numprocs, processor_name);MPI_Finalize(); /*结束*/ 第二部分第四部分执行结果进程进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位

17、。通俗理解:串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。正在微机上运行的进程单机内的多个进程多个进程可以同时存在于单机内同一操作系统:由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)。进程间相互独立(内存空间不相交):在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行。进程1内存进程2最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)、规约(reduction)。消息传递的实现:共享内存或信号量,用户不必关心。进

18、程间可以相互交换信息:例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式。同时运行于单机上的多个进程进程1内存进程2并行程序的单机运行方式进程3进程4Hello_world程序在单机上的运行方式启动程序,开始执行进程0进程1进程2进程3MPI_InitMPI_InitMPI_InitMPI_Initmyid=0myid=1myid=2myid=3numproces=4numproces=4numproces=4numproces=4获取机器名并打印获取机器名并打印获取机器名并打印获取机器名并打印MPI_FinalizeMPI

19、_FinalizeMPI_FinalizeMPI_Finalize程序结束包含于通过网络联接的不同计算机的多个进程 进程独立存在:进程位于不同的计算机,由各自独立的操作系统调度,享有独立的CPU和内存资源。 进程间相互信息交换:消息传递。 消息传递的实现:用户不必关心。进程0进程1进程2进程3通过网络进行消息传递基于消息传递的并行程序执行模式 共享存储与分布式存储 属于并行机体系结构的范畴,与消息传递并行程序设计平台无关。消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,任何支持进程间通信的并行机,均可支持消息传递并行程序设计。几乎所有共享和分布存储并行计算环境均支持进程间的消息

20、传递通信。共享存储与分布式存储(续) MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信。 SPMD执行模式:一个程序同时启动多份,形成多个独立的进程,在不同的处理机上运行,拥有独立的内存空间,进程间通信通过调用MPI函数来实现。 每个进程开始执行时,将获得一个唯一的序号(rank)。例如启动P个进程,序号依次为0,1,P-1。MPI程序在并行机上的执行模式 MPI程序的惯例 (1) 所有MPI的调用都有前缀“MPI_”( 常量、变量、过程、函数)。在自己编写的程序中不准说明以前缀“MPI_”开始的任何变量和函数 目的:避免与MPI

21、可能的名字混淆。MPI程序的惯例 (2) C形式的MPI调用,则为MPI_Aaaa_aaa的形式。MPI_Comm_rank(MPI_COMM_WORLD,&myid)第二讲 六个基本的MPI函数 2014.9.23一、MPI初始化调用说明: MPI_Init(int *argc, char *argv)功能:完成MPI程序的所有初始化工作(资源分配,通信域MPI_COMM_WORLD的形成等),所有MPI程序的第一条可执行语句都是它。二、MPI结束调用说明: int MPI_Finalize ( void ) 功能: 结束MPI程序的运行(释放资源及环境等),所有MPI程序的最后一条可执行语

22、句都是它,否则程序的运行结果是不可预知的。调用说明: MPI_Comm_rank(MPI_Comm comm, int *rank)功能: 返回调用进程在给定的通信域中的进程标识号,有了这一标识号,不同的进程就可以将自身和其它的进程区别开来,实现各进程的并行和协作。三、获取当前进程标识 一个通信域是所有可以进行相互通信的进程的集合,如果一共有N个进程参加通信,则进程编号从0到N1;现场提供一个相对独立的通信区域01234567891011012345012345进程标识号(进程id): 进程在某个通信域中的唯一的标识号; 一个进程可以属于不同的通信域,它在不同通信域中的标识号不同; 进程号为从

23、0开始的连续非否整数。MPI_COMM_WORLD 是MPI预定义的常量,是一个包含所有用户启动的进程的通信域MPI_Comm_rank(MPI_COMM_WORLD ,&my_rank) 四、获取通信域中所包含的进程总数调用说明: MPI_Comm_size(MPI_Comm comm, int *size)功能: 返回给定的通信域中所包括的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。MPI_Comm_size (MPI_COMM_WORLD ,&comm_sz) 五、消息发送调用说明:int MPI_Send(void* buf, int count,

24、 MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)功能:MPI_Send将发送缓冲区中的count个(不是以字节计数而是以数据类型为单位指定消息的长度)datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志就可以把本次发送的消息和本进程向同一目的进程发送的其它消息区别,其中datatype数据类型可以是MPI的预定义类型也可以是用户自定义的类型写一封信需要已知些什么?MPI消息 收信人姓名: 张三 收信人地址和邮编: 邮局邮戳 信中写些什么内容 用什么语言书写

25、汉语?英语? 信封内容1、MPI消息的组成MPI消息包括信封和数据两部份信封:源/目,标识,通信域数据:起始地址,数据个数,数据类型MPI_Send(buf,count,datatype,dest,tag,comm) 消息数据消息信封MPI_Recv(buf,count,datatype,source,tag,comm,status) 消息数据 消息信封2、MPI消息数据buf,count,datatypebuf: 发送(接收)缓冲区的起始地址 发送哪些连续数据?从内存的哪个位置开始发送? 接收到的数据存放在内存的什么位置?count: 发送(接收)数据的个数 发送(接收)多少个数?datat

26、ype: 发送(接收)的数据类型 发送(接收)什么样的数据?3、MPI消息信封发送:dest,tag,comm接收:source,tag,commdest: 目标进程(将消息发送给哪个进程?)source: 源进程 (从哪个进程接收消息?)tag: 消息标签(当发送者发送两个相同类型的数据给同一个接收者时,如果没有消息标识,接收者将如何区别这两个消息)MPI_SEND(buf,count,datatype,dest,tag,comm)buf发送缓冲区的起始地址(可选类型)count将发送的数据的个数(非负整数) datatype 发送数据的数据类型dest 目的进程标识号(整型)tag消息标志

27、(整型)comm 通信域发送些什么内容,发送哪些数据?发送多少个数,100个?200个?发送什么样的数据?是整数?实数?还是其它 ?发送给谁?接收方是谁?如果短时间内向同一进程发送了两次消息,如何区分它们?在哪个范围内发送?消息在哪个通信域内传递?举例内存数组A的第一个元素存放位置MPI_Send(A,100,MPI_FLOAT,2,1,MPI_COMM_WORLD)意义?说明: MPI预定义的数据类型MPI预定义了一些数据类型可以直接使用MPI预定义的与C一致的数据类型MPI预定义的数据类型相应的FORTRAN数据类型MPI_CHARMPI_SHORTMPI_INTMPI_LONGMPI_U

28、NSIGNED_CHARMPI_ UNSIGNED_SHORTMPI_UNSIGNEDMPI_UNSIGNED_LONGMPI_FLOATMPI_DOUBLEMPI_LONG_DOUBLEMPI_BYTEMPI_PACKEDsigned char (一个字节)signed short int (2个字节)signed int (4字节)signed long int(4字节)unsigned char (0-255,一个字节)unsigned short int(2字节)unsigned int 取决于系统unsigned long int (4字节)float (4字节)double (8字

29、节)long double (10字节)无对应类型无对应类型举例float a100;if(myid=0)MPI_Send(a,20,MPI_FLOAT,1,99,MPI_COMM_WORLD);if(myid=1)MPI_Recv(a,20,MPI_FLOAT,0,99,MPI_COMM_WORLD,&status);宿主语言的类型和通信操作所指定的类型相匹配发送方和接收方的类型相匹配六、消息接收定义:MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_Sta

30、tus *status)功能: 从进程source接收消息,并且该消息的数据类型和消息标识与本接收进程指定的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。MPI没有截断,接收到的消息大于接收缓冲区会发生溢出错误。如果一个短于接收缓冲区的消息到达,那么只有相应于这个消息的那些地址被修改。count可以是零,这种情况下消息的数据部分是空的MPI_RECV(buf,count,datatype,source,tag,comm,status)buf发送缓冲区的起始地址(可选类型)count将发送的数据的个数(非负整数) datatype 发送数据的数据类型S

31、ource 源进程标识号(整型)tag消息标志(整型)comm 通信域接收到的数据放在哪儿?最多接收多少个数,100个?200个?接收什么样的数据?是整数?实数?还是其它 ?从谁那儿接收?发送方是谁?如果短时间有一个进程向我发送了两次消息,如何区分它们?在哪个范围内接收?消息在哪个通信域内传递?举例内存数组A的首地址位置MPI_Recv(A,100,MPI_FLOAT,2,1,MPI_COMM_WORLD,status)意义?说明 接收到消息的长度必须小于或等于接收缓冲区的长度。 如果接收到的数据过大,MPI没有截断,接收缓冲区会发生溢出错误, 编程者要保证接收缓冲区的长度不小于发送数据的长度

32、。如果一个短于接收缓冲区的消息到达,那么只有相应于这个消息的那些地址被修改。 count可以是零,这种情况下消息的数据部分是空的。返回状态statusMPI定义的一个数据类型,使用之前需要用户为它分配空间。在C实现中,状态变量是由至少三个域组成的结构类型,这三个域分别是: MPI_SOURCE、MPI_TAG和MPI_ERROR通过对status.MPI_SOURCE、status.MPI_TAG和status.MPI_ERROR的引用就可以得到返回状态中所包含的发送数据进程的标识,发送数据使用的tag标识和本接收操作返回的错误代码说明方式:MPI_Status status举例MPI_Rec

33、v(A,100,MPI_FLOAT,2,1,MPI_COMM_WORLD,&status)则:status. MPI_SOURCE=2status.MPI_TAG=1status.MPI_ERROR=MPI_SUCCESS (MPI_ERRTYPE)一般不用这个参数,也可以用MPI预定义的常量MPI_STATUS_IGNORE完整的发送、接收程序举例#include “mpi.h”main(int argc, char * argv) int a60,rank,size; MPI_status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_C

34、OMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank=0) MPI_Send(a,20,MPI_INT,1,99,MPI_COMM_WORLD); if(rank=1) MPI_Recv(a,20,MPI_INT,0,99, MPI_COMM_WORLD,&status); MPI_Finalize( );执行过程进程0进程1size=2size=2myid=0myid=1发送消息接收消息结束结束执行过程(续)发送、接收前:进程0: ai=i进程1: ai=10*i发送、接收后:进程0: ai=i进程1: ai=i举例MP

35、I_Comm_rank(MPI_COMM_WORLD,&myid);if(myid=0) MPI_Recv( buf1,10,MPI_INT,1,1,MPI_COMM_WORLD,&status); MPI_Recv (buf2,10,MPI_INT,2,1,MPI_COMM_WORLD,&status);if(myid=1) MPI_Send (buf1,10 ,MPI_INT,0,1,MPI_COMM_WORLD );if ( myid =2 ) MPI_Send(buf2,10 ,MPI_INT,0,1,MPI_COMM_WORLD )消息来源于进程1消息来源于进程2消息发送给进程0消息

36、发送给进程0程序的执行过程进程0进程1进程2接收消息接收消息发送消息发送消息相关问题 任意源和任意标识MPI_ANY_SOURCE,MPI_ANY_TAG1、MPI_ANY_SOURCE: 任何进程发送的消息都可以接收,但其它要求必须满足;2、MPI_ANY_TAG: 任何标签的消息都可以接收,但其它要求必须满足;3、两者可同时使用,也可单独使用;4、不能给通信域comm指定任意值;5、发送操作与接收操作不对称。举例MPI_Comm_rank(MPI_COMM_WORLD,&myid);if(myid=0) MPI_Recv( buf1,10,MPI_INT,MPI_ANY_SOURCE,1,

37、 MPI_COMM_WORLD,&status); MPI_Recv (buf2,10,MPI_INT, MPI_ANY_SOURCE,1,MPI_COMM_WORLD,&status);if(myid=1) MPI_Send (buf1,10 ,MPI_INT,0,1,MPI_COMM_WORLD );if ( myid =2 ) MPI_Send(buf2,10 ,MPI_INT,0,1,MPI_COMM_WORLD )消息来源:可能是进程1,也可能是进程2消息发送给进程0消息发送给进程0消息来源:可能是进程1,也可能是进程2进程1进程2进程N-1进程0接收消息并打印进程0接收任意源和任意

38、标签的消息程序分析进程0: 接收来自于其它进程的消息 MPI_Recv(); source=MPI_ANY_SOURCE tag=MPI_ANY_TAG其它进程: 向进程0发送消息 MPI_Send(); dest=0; tag=任意值例题 编写一个MPI程序求取在给定端点时曲线与x轴所围成的面积问题的解决步骤:(1)分析串行机上求取曲线与X轴所成面积的方法与程序实现(2)并行机上任务的划分方法(3)通信的实现(4)任务组合(5)程序映射(1)串行机上求取面积的方法与程序实现伪代码:h=(b-a)/n;estimat=(f(a)+f(b)/2;for(i=1;in;i+) estimat +=

39、 f(x_i);estimat *= h;(2)并行机上任务的划分方法P1P2P3P4n=4m方法一、按每个进程承担的平均数划分方法二、轮转划分实现步骤1、各进程分别求出各自的区域面积大小;2、除零进程外,其它几个进程分别将各自计算得到的面积值发送给进程零;3、进程零执行comm_sz-1次接收操作,接收从其它所有进程发送过来的消息;4、进程零对所有进程的计算结果进行求和,求取面积并输出(3)通信 进程1,2,3comm_sz-1各执行一次发送操作,进程0执行comm_sz次接收操作(4)映射根据实际情况编写程序进阶:MPI的数据输入第三讲 简单的MPI程序示例并行计算应用及实战 王鹏 吕爽等

40、编著 机械工业出版社MPI并行程序设计实例教程 张武生 薛巍等编著 清华大学出版社讲课内容: 几个简单的MPI程序,实现一些简单功能目的: 学会使用MPI来实现一定的功能 学习一些新的MPI调用一、 用MPI实现计时功能1、MPI_WTIME调用的说明原型: double MPI_Wtime(void) 功能:返回一个用浮点数表示的秒数,从某一时刻到调用时刻所经历的时间(s)注意:调用产生结果的单位为秒,需要用户自己转换成其它时间单位。出错: (1)没有初始化; (2)MPI程序已经结束。2、MPI_WTIME函数的应用方法 double start_time,end_time,total_t

41、ime; (变量说明、初始化与其它计算) start_time=MPI_Wtime(); .(需要计时的部分) end_time=MPI_Wtime(); total_time=end_time-start_time; Printf(“It tooks %f secondsn”,total_time);3、MPI_WTICK调用的说明原型: double MPI_Wtick(void)功能:返回计算机时钟滴答一下所占用的时间(s)计算机所能分辨的最小时间出错: (1)没有初始化; (2)MPI程序已经结束。程序示例 (包含头文件 ) int main(int argc, char *argv)

42、 double t1,t2,tick; int rank; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); t1=MPI_Wtime(); /*获取起始时间*/ Sleep(1000); /*系统睡眠一秒钟*/ t2=MPI_Wtime(); /*获取终止时间*/ tick=MPI_Wtick(); /*获取本机的时间分辨率*/ printf(id=%d totaltime=%f tick=%10e2n,rank,t2-t1,tick); MPI_Finalize();二 获取机器的名字与MPI版本号一、获取机器名字 (调

43、用说明)int MPI_Get_processor_name(char *name, int *resultlen)OUT name 运行当前进程的机器的名字 OUT resultlen 机器名字的长度 功能:返回运行当前进程的机器的名字及其长度二、获取机器号、MPI版本号 调用说明 int MPI_Get_version(int *version, int subversion)OUT version MPI的主版本号 OUT subversion MPI的次版本号功能:返回MPI的版本号程序示例#include #include main(int argc, char *argv)char

44、 nameMPI_MAX_PROCESSOR_NAME;int resultlen,version,subversion;MPI_Init(&argc,&argv);MPI_Get_processor_name(name,&resultlen);MPI_Get_version(&version,&subversion);printf(“name=%s version=%d subversion=%dn, version,subversion,name);MPI_Finalize();三 数据接力传送控制台进程0进程1进程N-1结束?控制台是否接力传送示意图程序分析(假设有N个进程)(程序13)

45、通信的实现进程0: 读入一个值,并发送消息给进程1进程N_1:接收从进程N-2中发送的消息其它进程(假设进程号为M):接收从进程M-1中发送的消息, 将收到的消息发送给进程M+1进程0进程1进程2进程N-1 包含头文件,定义变量,初始化,获取进程号rank和进程个数size开始循环if(rank=0) 进程0读入数据并发送消息 scanf(“%d”,&value); 读入一个数据并将之发送到进程1 MPI_Send(&value,1,MPI_INT,rank+1, 0,MPI_COMM_WORLD); if(rank=size-1) 最后一个进程接收消息 MPI_Recv(&value,1,M

46、PI_INT,rank-1,0,MPI_COMM_WORLD,&status) if(rank0 & ranksize-1) 其它进程吸收并发送消息 MPI_Recv(&value,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&status) MPI_Send(&value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD);结束循环 MPI_Finalize(); MPI_Barrier功能:实现通信组的同步功能 阻赛所有的进程,直到所有进程都调用了它快的进程必须等待慢的进程,直到所有进程都执

47、行到该语句后才可以向下进行四 编写安全的MPI程序comm=MPI_COMM_WORLD;MPI_Comm_rank(MPI_COMM_WORLD,&rank);If(rank=0) MPI_Recv(x2 , 3 , MPI_INT,1,tag,comm,&status); MPI_Send(x1 , 3 , MPI_INT,1,tag,comm); If(rank=1) MPI_Recv(x1, 3 ,MPI_INT,0,tag,comm,&status); MPI_Send(x2, 3 ,MPI_INT,0,tag,comm); 假设程序启动时共产生两个进程程序执行步骤图进程0从进程1接

48、收消息向进程1发送消息进程1从进程0接收消息向进程0发送消息ACDB这个程序能够完成上述任务吗?程序的预期目标:1、两个进程分别从对方接收一个消息, 2、向对方发送一个消息。进程0从进程1接收消息向进程1发送消息进程1从进程0接收消息向进程0发送消息ACDBAD等待C等待等待B等待这样的程序能够正确执行吗?怎么改? 消息死锁 !comm=MPI_COMM_WORLD;MPI_Comm_rank(MPI_COMM_WORLD,&rank);If(rank=0) MPI_Recv(x2 , 3 , MPI_INT,1,tag,comm,&status); MPI_Send(x1 , 3 , MPI

49、_INT,1,tag,comm); If(rank=1) MPI_Recv(x1, 3 ,MPI_INT,0,tag,comm,&status); MPI_Send(x2, 3 ,MPI_INT,0,tag,comm); 两个进程都是先接收,后发送。没有发送,何谈接收?不合逻辑!comm=MPI_COMM_WORLDMPI_Comm_rank(MPI_COMM_WORLD,&rank)If(rank=0) MPI_Send(sendbuf , 3 ,MPI_INT , 1 ,tag , comm); MPI_Recv(recbuf , 3 , MPI_INT , 1, tag , comm ,

50、 &status);If(rank=1) MPI_Send(sendbuf , 3 , MPI_INT , 0 , tag , comm); MPI_Recv(recbuf, 3 , MPI_INT , 0 , tag ,comm , &status);改成:先发送,后接收这个程序的性能如何? 欲分析该程序的性能,应先了解上述通信模式中发送与接收操作的执行过程。进程0发送消息进程1接收消息开始接收全部接收缓存消息不缓存消息直接发送发送完成缓存完备发送完成依赖接收进程不依赖接收进程(1)是否缓存数据由MPI决定;(2)如果MPI决定缓存该数据,则发送操作可正确返回而不要求接收操作收到发送的数据;

51、(3)缓存数据要付出代价,缓冲区并非总是可以得到的。B进程0向进程1发送消息从进程1接收消息进程1向进程0发送消息从进程0接收消息修改后程序的执行步骤DCBA如果系统不缓存消息: 消息死锁!A等待D等待C等待等待进程0向进程1发送消息从进程1接收消息进程1向进程0发送消息从进程0接收消息修改后程序的执行步骤DCBAADCB系统缓冲区如果系统缓存消息:A,C两个发送操作都需要系统缓冲区,如果系统缓冲不足,消息传递将无法完成。 不安全的通信调用次序!comm=MPI_COMM_WORLDMPI_Comm_rank(MPI_COMM_WORLD,&rank)If(rank=0) MPI_Send(s

52、endbuf,count,MPI_INT,1,tag,comm); MPI_Recv(recbuf,count,MPI_INT,1,tag,comm,&status);If(rank=1) MPI_Recv(recbuf,count,MPI_INT,0,tag,comm,&status); MPI_Send(sendbuf,count,MPI_INT,0,tag,comm);再一次修改:发送与接收操作按次序进行匹配进程0向进程1发送消息从进程1接收消息进程1从进程0接收消息向进程0发送消息安全通信!ACDB1、只要C存在,则系统不提供缓冲区A也能够执行;2、C能够执行;3、A,C完成后,只要B

53、存在,系统不提供缓冲区D也能够执行;4、B能够执行。DCBA结论:将发送与接收操作按照次序进行匹配: 一个进程的发送操作在前,接收操作在后; 另一个进行的接收操作在前,发送操作在后;若将两个进程的发送与接收操作次序互换,其消息传递过程仍是安全的五 任意进程间相互问候进程0进程1进程2hellohellohellohellohellohello程序分析每个进程均需完成以下任务:1、将自身标识和被问候的进程标识放入消息数据buffer中;2、向除自身外的其它所有进程发送消息(buffer)3、接收其它进程对自己发送的问候消息程序分析任务一:将自身标识和被问候的进程标识放入消息数据buffer中;定

54、义一个整型数值存放需要发送的消息内容 int buffer2 将自身标识放入消息中 buffer0=me; 将被问候进程的标识放入消息中 buffer1=node;程序分析任务二:向除自身外的其它所有进程发送消息(buffer) ;for ( i=0; isize; i+ ) if ( i != me ) MPI_Send(buffer,2,MPI_INT, i ,tag1,MPI_COMM_WORLD) size为总的进程个数 程序分析任务三:3、接收其它进程对自己发送的问候消息for ( i=0; isize; i+ ) if ( i != me ) MPI_Recv(buffer,2,M

55、PI_INT, i ,tag1, MPI_COMM_WORLD,&status)第四讲组通信,群通信,集合通信第一节 组通信概述(Collective communication)组通信一般实现三个功能: 通信 同步 计算 一、组通信的消息通信功能一对一按通信方向的不同,组通信可分为三种一对多多对一多对多广播收集二、组通信的同步功能快的进程必须等待慢的进程,直到所有进程都执行到该语句后才可以向下进行同步点 进程完成同步调用后,所有的进程都已执行的同步点前面的操作三、组通信的计算功能组内消息通信处理结果存入接收缓冲区相应进程的消息处理MPI组通信的计算功能分三步实现:第一、通信的功能,消息根据要

56、求发送到目标进程,目标进程也接收到的所需的消息第二、消息的处理,即计算部分第三、将处理结果放入指定的接收缓冲区MPI_BCAST(buffer,count,datatype,root,comm)IN/OUTbuffer通信消息缓冲区的起始地址INcount 将广播出去/或接收的数据个数INdatatype 广播/接收数据的数据类型INroot 广播数据的根进程的标识号INcomm 通信域int MPI_Bcast(void* buffer,int count,MPI_Datatype datatype,int root, MPI_Comm comm)功能? 广 播(一对多) 同 步MPI_BA

57、RRIER(comm)IN commInt MPI_Barrier(MPI_Comm comm)归 约在进行通信的同时完成一定的计算除完成消息传递功能之外,还能对所传递的数据进行一定的操作或运算MPI_REDUCE调用MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm)INsendbuf 发送消息缓冲区的起始地址OUT recvbuf接收消息缓冲区中的地址 INcount 发送消息缓冲区中的数据个数 INdatatype 发送消息缓冲区的元素类型INop 归约操作符 INroot 根进程序列号 INcomm 通信域功能:将组内每个进程输

58、入缓冲区中的数据按给定的操作op进行运算,并将其结果返回到序列号为root的进程的输出缓冲区中。进程0进程1进程2进程N-1进程root缓冲区opopopopopopopopopopopopopopopopopopopopA0B0C0A1B1C1A2B2C2A0+A1+A2B0+B1+B2C0+C1+C2reduce进程0进程1进程2MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm)INsendbuf 发送消息缓冲区的起始地址OUT recvbuf接收消息缓冲区中的地址 INcount 发送消息缓冲区中的数据个数 INdatatype

59、 发送消息缓冲区的元素类型INop 归约操作符 INroot 根进程序列号 INcomm 通信域输入缓冲区由参数sendbuf、count和datatype定义;输出缓冲区由参数recvbuf、count和datatype定义;所有进程都提供长度、元素类型相同的输入和输出缓冲区. MPI预定义的归约操作 名字 含义MPI_MAX 最大值 MPI_MIN 最小值 MPI_SUM 求和 MPI_PROD 求积MPI_LAND 逻辑与 MPI_BAND 按位与MPI_LOR 逻辑或 MPI_BOR 按位或MPI_LXOR 逻辑异或MPI_BXOR 按位异或MPI_MAXLOC 最大值且相应位置MPI_MINLOC 最小值且相应位置 C与MPI类型的对应C语言中的整型: MPI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论