《并行程序设计导论》第三章课件.ppt

上传人:小飞机 文档编号:1292157 上传时间:2022-11-05 格式:PPT 页数:178 大小:5.22MB
返回 下载 相关 举报
《并行程序设计导论》第三章课件.ppt_第1页
第1页 / 共178页
《并行程序设计导论》第三章课件.ppt_第2页
第2页 / 共178页
《并行程序设计导论》第三章课件.ppt_第3页
第3页 / 共178页
《并行程序设计导论》第三章课件.ppt_第4页
第4页 / 共178页
《并行程序设计导论》第三章课件.ppt_第5页
第5页 / 共178页
点击查看更多>>
资源描述

《《并行程序设计导论》第三章课件.ppt》由会员分享,可在线阅读,更多相关《《并行程序设计导论》第三章课件.ppt(178页珍藏版)》请在三一办公上搜索。

1、Copyright 2010, Elsevier Inc. All rights Reserved,Chapter 3,用MPI进行分布式内存编程,An Introduction to Parallel ProgrammingPeter Pacheco,Copyright 2010, Elsevier Inc,Copyright 2010, Elsevier Inc. All rights Reserved,Roadmap,编写第一个MPI程序.常见的MPI函数.用MPI来实现梯形积分法.集合通信.MPI的派生数据类型.MPI程序的性能评估.并行排序算法.MPI程序的安全性.,# Chapte

2、r Subtitle,Copyright 2010, Elsevier Inc,分布式内存系统,Copyright 2010, Elsevier Inc. All rights Reserved,分布式内存系统Copyright 2010, Elsev,共享内存系统,Copyright 2010, Elsevier Inc. All rights Reserved,共享内存系统Copyright 2010, Elsevi,进程,进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位。通俗理解:串行应用程序编译形成的可执行代码,分为“指令”

3、和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。,进程进程是一个程序,同时包含它的执行环境(内存、寄存器、程序,正在微机上运行的进程,正在微机上运行的进程,单机内的多个进程,多个进程可以同时存在于单机内同一操作系统:由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)。进程间相互独立(内存空间不相交):在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行。,单机内的多个进程多个进程可以同时存在于单机内同一操作系统:由,最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)

4、、规约(reduction)。消息传递的实现:共享内存或信号量,用户不必关心。进程间可以相互交换信息:例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式。,最基本的消息传递操作:发送消息(send)、接受消息(rec,同时运行于单机上的多个进程,同时运行于单机上的多个进程,进程1,内存,进程2,并行程序的单机运行方式,进程3,进程4,进程1内存进程2并行程序的单机运行方式进程3进程4,消息传递并行程序设计MPI,Copyright 2010, Elsevier Inc. All rights Reserved,消息传递并行程

5、序设计用户必须通过显式地发送和接收消息来实现处理机间的数据交换每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现适用于大规模并行处理机(MPP)和机群(Cluster),消息传递并行程序设计MPICopyright 2010,Copyright 2010, Elsevier Inc. All rights Reserved,并行计算粒度大,适合大规模可扩展并行算法消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法,Copyright 2010, Elsevier Inc,什么是MPI?,Cop

6、yright 2010, Elsevier Inc. All rights Reserved,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C。一种新的库描述,不是一种语言共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用是一种标准或规范,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,什么是MPI?Copyright 2010, Elsev,为什么要使用MPI?,Copyright 2010, Elsevier Inc. All rights

7、Reserved,高可移植性MPI已在PC机、MS Windows以及所有主要的Unix工作站上和所有主流的并行机上得到实现使用MPI作消息传递的C或Fortran并行程序可不加改变地在上述平台实现,为什么要使用MPI?Copyright 2010, El,MPI的发展过程,Copyright 2010, Elsevier Inc. All rights Reserved,发展的两个阶段1994年5月完成1.0版支持C和Fortran77制定大部分并行功能1997年4月完成2.0版动态进程并行I/O支持Fortran 90和C+,MPI的发展过程Copyright 2010, Else,常用的

8、MPI版本,Copyright 2010, Elsevier Inc. All rights Reserved,MPICH 是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性当前最新版本有MPICH 3.2http:/www.mpich.org/LAMMPI美国Indiana 大学Open Systems 实验室实现http:/lammps.sandia.gov更多的商业版本MPIHP-MPI,MS-MPI,所有的版本遵循MPI标准,MPI程序可以不加修改的运行,常用的MPI版本Copyright 2010, Else,Hello World!

9、,Copyright 2010, Elsevier Inc. All rights Reserved,(a classic),Hello World! Copyright 2010,从简单入手,Copyright 2010, Elsevier Inc. All rights Reserved,下面我们首先分别以C语言的形式给出一个最简单的MPI并行程序 Hello 该程序在终端打印出Hello World!字样.,从简单入手Copyright 2010, Elsevie,识别 MPI 进程,在并行编程中,常见的是将进程按照非负整数来进行标注.p 个进程被编号为0, 1, 2, . p-1,Co

10、pyright 2010, Elsevier Inc. All rights Reserved,识别 MPI 进程在并行编程中,常见的是将进程按照非负整数来,第一个 MPI 程序,Copyright 2010, Elsevier Inc. All rights Reserved,第一个 MPI 程序Copyright 2010, El,编译,生成hello的可执行代码,Copyright 2010, Elsevier Inc. All rights Reserved,mpicc -g -Wall -o mpi_hello mpi_hello.c,C语言编译器的包装脚本,打印警告信息,源文件,创

11、建编译后的输出文件(默认为a.out),加入调试信息,编译,生成hello的可执行代码Copyright 20,执行,Copyright 2010, Elsevier Inc. All rights Reserved,mpiexec -n ,mpiexec -n 1 ./mpi_hello,mpiexec -n 4 ./mpi_hello,用1个进程运行程序,用4个进程运行程序,执行Copyright 2010, Elsevier I,Execution,Copyright 2010, Elsevier Inc. All rights Reserved,mpiexec -n 1 ./mpi_h

12、ello,mpiexec -n 4 ./mpi_hello,Greetings from process 0 of 1 !,Greetings from process 0 of 4 !Greetings from process 1 of 4 !Greetings from process 2 of 4 !Greetings from process 3 of 4 !,ExecutionCopyright 2010, Els,3.1.2 MPI 程序,C语言.包含了main函数.标准头文件 stdio.h, string.h, etc.包含 mpi.h 头文件.所有MPI定义的标识符都由字符

13、串 “MPI_”开始.下划线后的第一字母大写。表示函数名和MPI定义的类型避免混淆,Copyright 2010, Elsevier Inc. All rights Reserved,3.1.2 MPI 程序C语言.Copyright 20,MPI程序的框架结构,MPI程序的框架结构头文件包含MPI库相关变量的声明定义与通,用C+MPI实现hello world!,#include mpi.h#include #include void main(int argc,char* argv) int myid, numprocs namelen; char processor_nameMPI_MA

14、X_PROCESSOR_NAME; MPI_Init( /*结束*/ ,第二部分,第四部分,第三部分第五部分第一部分用C+MPI实现hello worl,执行结果,执行结果,MPI基本调用,MPI为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:,MPI基本调用 MPI为程序员提供一个并行环境,从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现:MPI_INIT: 启动MPI环境MPI_COMM_SI

15、ZE: 确定进程数MPI_COMM_RANK: 确定自己的进程标识符MPI_SEND: 发送一条消息MPI_RECV: 接收一条消息MPI_FINALIZE: 结束MPI环境,从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实,(1)MPI初始化:通过MPI_Init函数进入MPI环境并完成所有的初始化工作。int MPI_Init( int *argc, char * * * argv )(2)MPI结束:通过MPI_Finalize函数从MPI环境中退出。int MPI_Finalize(void),(1)MPI初始化:通过MPI_Init函数进入MPI环境并,(3)获取进程的编

16、号:调用MPI_Comm_rank函数获得当前进程在指定通信域中的编号,将自身与其他程序区分。 int MPI_Comm_rank(MPI_Comm comm, int *rank) (4)获取指定通信域的进程数:调用MPI_Comm_size函数获取指定通信域的进程个数,确定自身完成任务比例。 int MPI_Comm_size(MPI_Comm comm, int *size),(3)获取进程的编号:调用MPI_Comm_rank函,(5)消息发送:MPI_Send函数用于发送一个消息到目标进程。 int MPI_Send(void *buf, int count, MPI_Datatyp

17、e dataytpe, int dest, int tag, MPI_Comm comm) (6)消息接受:MPI_Recv函数用于从指定进程接收一个消息 int MPI_Recv(void *buf, int count, MPI_Datatype datatyepe,int source, int tag, MPI_Comm comm, MPI_Status *status),(5)消息发送:MPI_Send函数用于发送一个消息到,最简单的hello.c,Copyright 2010, Elsevier Inc. All rights Reserved,#include #include

18、mpi.h“main( int argc, char *argv ) MPI_Init( ,最简单的hello.cCopyright 2010, E,MPI初始化- MPI_INIT,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句启动MPI环境,标志并行代码的开始并行代码之前,第一个mpi函数(除MPI_Initialize外)要求main必须带参数运行。否则出错,Copyright 2010, Elsevier In

19、c. All rights Reserved,MPI初始化- MPI_INITint MPI_Init(i,MPI结束- MPI_FINALIZE,int MPI_Finalize(void) MPI_ Finalize(IERROR)MPI_INIT是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程之后串行代码仍可在主进程(rank = 0)上运行(如果必须),Copyright 2010, Elsevier Inc. All rights Reserved,MPI结束- MPI_

20、FINALIZEint MPI_Fin,运行MPI程序 hello.c,编译:mpicc -o hello hello.c运行:./hello 0 Aborting program ! Could not create p4 procgroup.Possible missing fileor program started without mpirun.运行:mpiexec -np 4 helloHello World!Hello World!Hello World!Hello World!,Copyright 2010, Elsevier Inc. All rights Reserved,运

21、行MPI程序 hello.c编译:mpicc -o hel,Hello是如何被执行的?,SPMD: Single Program Multiple Data(MIMD),Copyright 2010, Elsevier Inc. All rights Reserved,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *a

22、rgv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,Hello World!Hello World!Hello World!Hello World!,Hello是如何被执行的?SPMD: Single Prog,Hello程序在单机上的运行方式,Hello程序在单机上的运行方式启动程序,开始执行进程0进程,基本框架,Copyright 2010, Elsevier Inc. Al

23、l rights Reserved,基本框架Copyright 2010, Elsevier,开始写MPI程序,写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少进程来进行并行计算?我是哪一个进程?,Copyright 2010, Elsevier Inc. All rights Reserved,开始写MPI程序写MPI程序时,我们常需要知道以下两个问题的,通信子,一组可以相互发送消息的进程集合.MPI_Init 在用户启动程序时,定义由用户启动的所有进程所组成的通信子.称为 MPI_COMM_WORLD.,Copyright 2010, Elsevier Inc. All rig

24、hts Reserved,通信子 一组可以相互发送消息的进程集合.Copyright,MPI提供了下列函数来回答这些问题:用MPI_Comm_size 获得进程个数p int MPI_Comm_size(MPI_Comm comm, int *comm_sz_p)用MPI_Comm_rank 获得进程的一个叫my_rank_p的值,该值为0到p-1间的整数,相当于进程的ID int MPI_Comm_rank(MPI_Comm comm, int *my_rank_p),Copyright 2010, Elsevier Inc. All rights Reserved,MPI提供了下列函数来回

25、答这些问题:Copyright ,更新的Hello World(C语言),Copyright 2010, Elsevier Inc. All rights Reserved,#include #include mpi.h”main( int argc, char *argv ) int myid,numprocs; MPI_Init( ,更新的Hello World(C语言)Copyright ,运行结果,mpicc o hello1 hello1.cmpiexec -np 4 hello1结果: I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4,

26、Copyright 2010, Elsevier Inc. All rights Reserved,运行结果mpicc o hello1 hello1.cCo,3.1.6 通信有消息传递greetings(C语言),Copyright 2010, Elsevier Inc. All rights Reserved,#include #include mpi.h”main( int argc, char *argv ) int myid,numprocs,soure; MPI_Status status; char message100; MPI_Init( ,3.1.6 通信有消息传递gree

27、tings(C语言)C,Copyright 2010, Elsevier Inc. All rights Reserved,if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,strlen(message)+1,MPI_CHAR, 0,99,MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /

28、* end main */,Copyright 2010, Elsevier Inc,Greeting执行过程,Copyright 2010, Elsevier Inc. All rights Reserved,进程 0rank=0,进程 1rank=1,进程 2rank=2,进程 3rank=3,Greeting执行过程Copyright 2010,解剖greeting程序,头文件:mpi.h/mpif.hint MPI_Init(int *argc, char *argv)通信组/通信子: MPI_COMM_WORLD一个通信组是一个进程组的集合。所有参与并行计算的进程可以组合为一个或多个

29、通信组执行MPI_Init后,一个MPI程序的所有进程形成一个缺省的组,这个组被写作MPI_COMM_WORLD该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围,Copyright 2010, Elsevier Inc. All rights Reserved,解剖greeting程序头文件:mpi.h/mpif.hCo,int MPI_Comm_size (MPI_Comm comm, int *size)获得通信组comm中包含的进程数int MPI_Comm_rank (MPI_Comm comm, int *rank) 得到本进程在通信组中的rank值,即在组中

30、的逻辑编号(从0开始)int MPI_Finalize(),Copyright 2010, Elsevier Inc. All rights Reserved,int MPI_Comm_size (MPI_Comm co,消息传递,数据传送同步操作需要发送方和接受方合作完成,Copyright 2010, Elsevier Inc. All rights Reserved,MPI_Send(A, 10, MPI_DOUBLE, 1, 99, MPI_COMM_WORLD);MPI_Recv(B, 20, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, ,消息传递数据传送同

31、步操作Copyright 2010,Copyright 2010, Elsevier Inc. All rights Reserved,MPI函数的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数确实有限。下面是6个最基本也是最常用的MPI函数MPI_Init();MPI_Comm_size()MPI_Comm_rank()MPI_Send()MPI_Recv()MPI_Finalize()下面更多的了解MPI,Copyright 2010, Elsevier Inc,int MPI_Send(void* msg_buf_p, int msg_size, MPI_Datatyp

32、e msg_type,int dest, int tag, MPI_Comm communicator);IN msg_buf_p 发送缓冲区的起始地址IN msg_size 要发送信息的元素个数IN msg_type 发送信息的数据类型IN dest 目标进程的rank值IN tag 消息标签IN communicator 通信组,Copyright 2010, Elsevier Inc. All rights Reserved,int MPI_Send(void* msg_buf_p,通信,Copyright 2010, Elsevier Inc. All rights Reserved,

33、通信Copyright 2010, Elsevier I,一些预先定义的MPI数据类型,Copyright 2010, Elsevier Inc. All rights Reserved,一些预先定义的MPI数据类型Copyright 2010,int MPI_Recv(void* msg_buf_p, int buf_size, MPI_Datatype buf_type, int source, int tag, MPI_Comm comminicator, MPI_Status *status_p);OUT msg_buf_p 发送缓冲区的起始地址IN buf_size 要发送信息的元素

34、个数IN buf_type 发送信息的数据类型IN source 目标进程的rank值IN tag 消息标签IN comminicator 通信子OUT status_p status_p对象,包含实际接收到的消息的有关信息,Copyright 2010, Elsevier Inc. All rights Reserved,int MPI_Recv(void* msg_buf_p,Communication,Copyright 2010, Elsevier Inc. All rights Reserved,CommunicationCopyright 2010,为什么使用消息标签(Tag)?,

35、Copyright 2010, Elsevier Inc. All rights Reserved,为什么使用消息标签(Tag)?Copyright 201,在消息传递中使用标签,Copyright 2010, Elsevier Inc. All rights Reserved,使用标签的另一个原因是可以简化对下列情形的处理:假定有两个客户进程P和R, 每个发送一个服务请求消息给服务进程Q.,在消息传递中使用标签Copyright 2010, El,3.1.9 消息匹配,Copyright 2010, Elsevier Inc. All rights Reserved,MPI_Sendsrc

36、= q,MPI_Recvdest = r,r,q,3.1.9 消息匹配Copyright 2010, El,Copyright 2010, Elsevier Inc. All rights Reserved,接收buffer必须至少可以容纳count个由datatype参数指明类型的数据. 如果接收buf太小, 将导致溢出、出错消息匹配参数匹配dest,tag,comm/ source,tag,commSource = MPI_ANY_SOURCE:接收任意处理器来的数据(任意消息来源).Tag = MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息)在阻塞式消息传送中不允许Sou

37、rce=Dest,否则会导致死锁消息传送被限制在同一个communicator.在send函数中必须指定唯一的接收者,Copyright 2010, Elsevier Inc,接收消息,接收者可以在不知道以下信息的情况下接收消息:消息中的数据量,消息的发送者,消息的标签.,Copyright 2010, Elsevier Inc. All rights Reserved,接收消息接收者可以在不知道以下信息的情况下接收消息:Copy,status_p参数,当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和tag值?在C中,status.MP

38、I_SOURCE, status.MPI_TAG.Status还可用于返回实际接收到消息的长度int MPI_Get_count( MPI_Status status_p, MPI_Datatype type, int* count.p ) IN status_p 接收操作的返回值. IN type 接收缓冲区中元素的数据类型 OUT count.p 接收消息中的元素个数,Copyright 2010, Elsevier Inc. All rights Reserved,status_p参数当使用MPI_ANY_SOURCE或/和,Copyright 2010, Elsevier Inc. A

39、ll rights Reserved,MPI_SOURCEMPI_TAGMPI_ERROR,MPI_Status*,MPI_Status* status;status.MPI_SOURCEstatus.MPI_TAG,status_p参数,Copyright 2010, Elsevier Inc,How much data am I receiving?,Copyright 2010, Elsevier Inc. All rights Reserved,How much data am I receiving?C,分析greetings,#include #include mpi.h”main

40、( int argc, char *argv ) int numprocs; /*进程数,该变量为各处理器中的同名变量,存储是分布的*/ int myid; /*进程ID,存储也是分布的 */ MPI_Status status; /*消息接收状态变量,存储也是分布的 */ char message100; /*消息buffer,存储也是分布的 */ /*初始化MPI*/ MPI_Init( ,分析greetings,分析greetings,if (myid != 0) /*建立消息*/ sprintf(message, Greetings from process %d!,myid); /*

41、 发送长度取strlen(message)+1,使0也一同发送出去*/ MPI_Send(message,strlen(message)+1,MPI_CHAR, 0,99,MPI_COMM_WORLD); else /*myrank = 0*/ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* end main */,分析greetings if (myid != 0) ,MPI_Send和MPI_Recv的问题,MPI_Send的

42、精确行为是由MPI实现决定的MPI_Send可能有不同大小的缓冲区,是缓冲还是阻塞可以由一个消息“截止”大小决定( cutoffs message size)MPI_Recv总是被阻塞的,直到接收到一条匹配的消息了解你的执行情况;不要做假设!,Copyright 2010, Elsevier Inc. All rights Reserved,MPI_Send和MPI_Recv的问题MPI_Send的精,用MPI实现梯形积分法,Copyright 2010, Elsevier Inc. All rights Reserved,用MPI实现梯形积分法Copyright 2010, E,梯形积分法,

43、Copyright 2010, Elsevier Inc. All rights Reserved,梯形积分法Copyright 2010, Elsevie,一个梯形,Copyright 2010, Elsevier Inc. All rights Reserved,一个梯形Copyright 2010, Elsevier,梯形积分法,Copyright 2010, Elsevier Inc. All rights Reserved,梯形积分法Copyright 2010, Elsevie,梯形积分法的串行伪代码,Copyright 2010, Elsevier Inc. All rights

44、 Reserved,梯形积分法的串行伪代码Copyright 2010, E,并行化的梯形积分法,将问题的解决方案划分成多个任务。在任务间识别出需要的通信信道。将任务聚合成复合任务。在核上分配复合任务。,Copyright 2010, Elsevier Inc. All rights Reserved,并行化的梯形积分法将问题的解决方案划分成多个任务。Copyr,并行梯形积分法的任务和通信,Copyright 2010, Elsevier Inc. All rights Reserved,并行梯形积分法的任务和通信Copyright 2010,梯形积分法的并行伪代码,Copyright 201

45、0, Elsevier Inc. All rights Reserved,梯形积分法的并行伪代码Copyright 2010, E,并行代码C语言,Copyright 2010, Elsevier Inc. All rights Reserved,并行代码C语言Copyright 2010, Elsev,并行代码C语言,Copyright 2010, Elsevier Inc. All rights Reserved,并行代码C语言Copyright 2010, Elsev,Trap函数,Copyright 2010, Elsevier Inc. All rights Reserved,Tra

46、p函数Copyright 2010, Elsevi,3.3 I/O处理,Copyright 2010, Elsevier Inc. All rights Reserved,每个进程只打印一条消息,3.3 I/O处理Copyright 2010, El,Running with 6 processes,Copyright 2010, Elsevier Inc. All rights Reserved,输出不确定性:输出的顺序是无法预测的,Running with 6 processesCopyri,输入,大部分的MPI实现只允许MPI_COMM_WORLD 中的0号进程访问标准输入stdin。0

47、号进程负责读取数据(scanf) ,并将数据发送给其他进程。,Copyright 2010, Elsevier Inc. All rights Reserved,Get_input,输入 大部分的MPI实现只允许MPI_COMM_WORLD,一个用于读取用户输入的函数,Copyright 2010, Elsevier Inc. All rights Reserved,一个用于读取用户输入的函数Copyright 2010,3.4 集合通信,Copyright 2010, Elsevier Inc. All rights Reserved,3.4 集合通信Copyright 2010, Else

48、,通信类型,MPI点对点通信阻塞型和非阻塞型Blocking ,Non-BlockingMPI集合通信,Copyright 2010, Elsevier Inc. All rights Reserved,通信类型MPI点对点通信Copyright 2010,MPI点对点通信,阻塞型通信阻塞型通信函数需要等待指定的操作实际完成,或所涉及的数据被 MPI 系统安全备份后才返回。Memory referenced is ready for reuse, Non local operationMPI_SEND, MPI_RECV,Copyright 2010, Elsevier Inc. All ri

49、ghts Reserved,MPI点对点通信阻塞型通信Copyright 2010,非阻塞通信非阻塞型通信函数总是立即返回,实际操作由 MPI 后台进行,需要调用其它函数来查询通信是否完成。Local operation在实际操作完成之前对相关数据区域的操作是不安全的在有些并行系统上(Communication processors),使用非阻塞型函数可以实现计算与通信的重叠进行MPI_ISEND, MPI_IRECV,Copyright 2010, Elsevier Inc. All rights Reserved,非阻塞通信Copyright 2010, Elsevie,MPI集合通信,集

50、合通信 (collective communication)是一个进程组中的所有进程都参加的全局通信操作。按照通信方向的不同,集合通信可分为三种类型:一对多:一个进程向其它所有的进程发送消息,这个负责发送消息的进程叫做Root进程。多对一:一个进程负责从其它所有的进程接收消息,这个接收的进程也叫做Root进程。 多对多:每一个进程都向其它所有的进程发送或者接收消息。,Copyright 2010, Elsevier Inc. All rights Reserved,MPI集合通信集合通信 (collective commun,集合通信一般实现三个功能: 通信,同步和计算通信功能主要完成组内数据

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号