版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录
■第一章并行计算概述
・第二章MPI简介
■第三章MPI编程
■第四章MPI高级编程
目录
>第一章并行计算概述
・第二章MPI简介
■第三章MPI编程
■第四章MPI高级编程
第一章并行计算概述
-为什么要采用并行计算?
■并行计算机的分类
并行算法的分类
4fenoi/o联想
串行程序的发展阻碍
■物理速度渐变发展
-芯片速度每18月加快一倍
-内存传输率每年加快9%
-物理极限无法突破
-芯片晶体管接近原子极限
-传输速度不可能突破光速
计算速度如何提升?
5fenoi/o联想
下一步?
并行计
6fenoi/o联想
为什麽要采用并行计算?
-串行程序速度提升缓慢
■可以加快速度
-更短的时间内解决相同的问题
-相同的时间内解决更多更复杂的问题
■可以加大规模--计算更大规模的问题
7fenoi/o联想
并行计算机的分类:
指令与数据:
数
数
据
据
个
个
数
数
DD
MSIMDMIMDMSPMDMPMD
SSISDMISDSSPSDMPSD
SM指令个数ISM程序个数P
8fenoi/o联想
存储方式
-共享内存
・ccNUMA;SMP
-分布式内存
・MPP;Cluster
9fenoi/o联恕
三种计算模型
legend:processormemorynetwork
(c)
uniprocessordistributedmemory
10fenoi/o联想
并行化分解方法
■任务分解
-多任务并发执行
■功能分解
-分解被执行的计算
■区域分解
-分解被执行的数据
11fenoi/o联想
分布内存并行方式
■任务并行
-不同参数的大量工况计算
■区域分解并行
-大规模多节点分块并行计算
12加nouo联想
并行算法的分类
'按运算的基本对象
-数值并行算法(数值计算)
-非数值并行算法(符号计算)
■按进程间的依赖关系
-同步并行算法
-异步并行算法
-纯并行算法
'按并行计算任务的大小
-粗粒度并行算法
-中粒度并行算法
-细粒度并行算法
13fenoi/o联想
目录
■第一章并行计算概述
>第二章MPI简介
■第三章MPI编程
■第四章MPI高级编程
第二章MP工简介
什么是MP工?
MP工的实现
MP工的安装
MP工的编译
MP工的运行
15■enouo联想
什么是MP工?
MPI(MassagePassing工nt㊀rfac㊀)
・1994年5月发布的一种消息传递接口
■MP工是一个库,而不是一门语言
■MP工是一种标准或规范的代表
■MP工是一个消息传递编程模型
■MP工提供与C和Fortran语言的绑定
16fenoi/o联想
MP工的历史
-MP工初稿:美国并行计算中心工作会议(92年4月)
■MP工-1公布:第一届MP工大会(93年1月)
■MP工标准正式发布:1994年5月
■MP工-2发布:MP工论坛(97年)
17fenoi/o联想
MP工的实现
■MPICH:最重要的MP工实现
-与MP工-1规范同步发展的版本
-支持部分MP工-2的特征(如动态生成进程等)
-MPICHGM*-支持Myrinet
-MVAPICH*一支持InfiniBand
LAM(LocalAr㊀aMulticomput㊀r)
-OhioStat㊀Univ㊀rsity开发
-http://WWW.工am-mpi.org/download/下载
18fenoi/o联想
MP工的安装—MPICH
■步骤一:下载最近的安装包
・步骤二:解压缩
-tar-xzvfmpich.tar.gz
19fenoi/o联想
MP工的安装一MPICH
■步骤三:configur㊀
-几个重要的配置选项:
•通讯设备
•编译器
・支持SMP?
-执行:
configur㊀一with—d㊀vic^=ch_p4\
-cc=icc-fc=ifc-f90=ifc—c++=icc\
-prefix=/usr/local/mpich-1.2.5
-查看日志文件
20fenoi/o联想
MP工的安装—MPICH
■步骤四:编译
-执行:make>&mak㊀.log
-查看日志文件
■步骤五:安装
-执行:makeinstall
21fenoi/o联想
MP工的编译
-用MP工的编译器:
-mpif77-ompi_progmpi_prog.f
-mpicc-ompi_progmpi_proc.c
-mpif90-ompi_progmpi_prof.f90
-mpiCC-ompi_progmpi_prof.C
■用工nt㊀1编译器:
-ifc-ompi_progmpi_prog.f
-L/usr/local/mpich-1.2.5/lib-Ifmpich-Impich
22fenoi/o联想
MP工的运行
运行过程:
23fenoi/o联想
目录
■第一章并行计算概述
・第二章MPI简介
>第三章MPI编程
■第四章MPI高级编程
第二早MPI编程
A简单的MP工编程
■用户自定义类型
安全的通讯模式
25跖/101/0联想
MPI介绍
■MP工是个复杂的系统,它为程序员提供一个并行环境库,程序员
通过调用MP工的库程序来达到程序员所要达到的并行目的
■MP工提供C语言和Fortran语言接口,它包含了129个函数(根
据1994年发布的MP工标准),1997年修订的标准(MPI-2),
已超过200多个,目前最常用的也有约30个
■可以只使用其中的6个最基本的函数就能编写一个完整的MP工程
序去求解很多问题
26fenoi/o联想
程序1、第一个FORTRAN77+MP工程序
programmain
includ㊀*mpif.h'
character*(MPI_MAX_PROCESSOR_NAME)
proc㊀ssor_nam㊀
int㊀g㊀rmyid,numprocs,nam㊀1㊀n,rc,i㊀rr
callMPI_INIT(ierr)
callMPI_COMM_RANK(MPI_COMM_WORLD,myidri㊀rr)
callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocsAi㊀rr)
callMPI_GET_PROCESSOR_NAME(proc㊀ssor_nam㊀,
nam㊀1㊀n,i㊀rr)
writ㊀(*,10)myid,numprocs,proc㊀ssor_nam㊀
FORMAT(*HelloWorld!Process\12,*of',[1,*on
I20A)
callMPI_FINALIZE(rc)
end
27fenoi/o联想
程序1在一台机器上执行的结果:
HelloWorld!Process1of4oncOlOl
HelloWorld!Process0of4oncOlOl
HelloWorld!Process2of4oncOlOl
HelloWorld!Process3of4oncOlOl
程序1在四台机器上执行的结果:
HelloWorld!Process3of4onc0104
HelloWorld!Process0of4oncOlOl
HelloWorld!Process2of4onc0103
HelloWorld!Process1of4onc0102
28fenoi/o联想
,t•,HelloWorldM<I
MPI_F1NALIZEMPLFINAL1ZE
▼
“HelloWorld”秩序结束
程序2、简单C+MP工的例子
#inclucl㊀、'mpi.h〃
main(intargc,char**argv)
(
intnumprocs,myrankfifj,k;
MPI_Statusstatus;
charmsg[20];
MP(&argc,Sargv);
MP1_Comm_siz㊀(MPH_COMM_WORLD,Snumprocs);
MPI_Comm_rank(MPI_COMM_WORLD,Smyrank);
30fenoi/o联想
程序2、简单C+MP工的例子
if(myrank==0)
(
strcpy(msg,,AHelloWorld");
MP工_S㊀nd(msg,strl㊀n(msg)+1,MPI_CHAR,
1,99,MPI_COMM_WORLD);
}
㊀Is㊀if(myrank==1)
{
MP工_R㊀cv(msg,20,MPI_CHAR,0,99,
MPI_COMM_WORLD,&status);
printf(、'R㊀c㊀iv㊀message=%s\n〃,msg);
}
MP工—Finalize();
31fenoi/o联想
MP工程序的一般结构
MP工程序结构
■读文件只用一个进程来读
■并行程序中关键的是if语句,决定每个进程做什么
33fenoi/o联想
头文件
MP工程序要求:所有包含MP工调用的程序文件头应加入:
C包含文件Fortran包含文件
#include"mpi.h"Include"mpif.h5
34fenoi/o联想
MP工函数一并行环境管理函数
■MPI_Init()
FORTRAN:MPI_INIT(IERR)
MPI_Init(*argcz*argv)
-MP工的初始化例行函数,用于初始化MP工运行环境
-必须调用;首先调用;调用一次
MP工_Finaliz㊀()
FORTRAN:MPI_FINALIZED(IERR)
C:intMPI_Finalize(void)
-结束MP工执行环境。该函数一旦被应用程序调用时,就不
能调用MP工的其它例行函数(包括MP工」nit)
35后noi/o联想
MP工函数一并行环境管理函数
■MPialized()
FORTRAN:MPI_INITIALIZED(flag,ierr)
C:intMPialized(intflag)
参数说明:
Outflag,如果MP工—工nit被调用,返回值为tru㊀,否贝Ll为flas㊀
-若程序中不确定是否已经调用了MP工—工nit,可以使用
MPIJnitializ㊀d来检查
-唯一的可以在调用MP工—工nit之前使用的函数
-唯一的可以在任何位置调用的函数
36fenoi/o联想
MP工函数一进程组操作函数
MPI_Comm_group()
FORTRAN:MPI_COMM_GROUP(COMM,GROUP,IERR)
INTEGER::COMM,GROUP,IERR
C:intMPI_Comm_group(MPI_commcomm,
MP工_Group*group)
参数说明:
INCOMM,通信因子
OUTGROUP,对应COMM的进程组
-用来建立一个通信因子对应的新进程组,之后就可以对此进
程组进行需要的操作。
37fenoi/o联想
通信因子和组
-MP工通过指定通信因子和组来对进程进行一种逻辑上的划分,通
讯因子定义了进程组内或组间通讯的上下文(具体就是指明通讯
链路的数据结构指针)。
■MP工_COMM_WORLD通信因子是在MP工环境初始化过程中仓ll建
Process0Process1Process2Process3Process4
Process5Process6Process7Process8
MPI_COMM_WORLD
38fenoi/o联想
MP工函数一进程组操作函数
■MP工_Group_fr㊀㊀()
FORTRAN:MPI_GROUP_FREE(GROUP,IERR)
INTEGER::GROUP,IERR
C:intMPI_Group_free(MPI_Group*group)
参数说明:
工NOUTGROUP,释放进程组并返回MP工_GROUP_NULL
-MP工_Group_fr㊀㊀被调用后,任何关于此进程组的操作
将被视为无效。
39fenoi/o联想
MP工函数一进程组操作函数
■MPI_Group_size()
FORTRAN:MPI_GROUP_SIZE(GROUP,SIZE,IERR)
INTEGER::GROUP,SIZE,IERR
C:intMPI_Group_size(MPI_Group*group,int*size)
参数说明:
INGROUP,进程组
OUTSIZE,进程组中的进程个数
-如果进程组MP工_GROUP_EMPTY,贝U返回值S工ZE为0。
40fenoi/o联想
MP工函数一进程组操作函数
■MPI_Group_rank()
FORTRAN:MPI_GROUP_RANK(GROUP,RANK,IERR)
INTEGER::GROUP,RANK,IERR
C:intMPI_Group_rank(MPI_Group*group,int*rank)
参数说明:
INGROUP,进程组
OUTRANK,进程在进程组中的编号_________________
-如果进程不是进程组的成员,则返回值RANK为
MPIUNDEFINDEDo
41fenoi/o联想
MP工函数一进程组操作函数
■MP工Grouptranslaterank()_________________________
FORTRAN:MPI_GROUP_TRANSLATE_RANK(GROUP1ANARANKS1A
GROUP2,RANKS2AIERR)
INTEGER::GROUPl.N,RANKS1(*),GROUP2,RANKS2(*),工ERF
C:intMPI_Group_translate_rank(MPI_Group*group」
,intn,int*rankslrMPI_Group*group2,int*ranks2)
参数说明:
INGROUPlz进程组1一
INN,RANKS1和RANKS2中数组元素个数
INRANKS1,进程组1中有效编号组成的数组
INGROUP2z进程组2一
OUTRANKS2,RANKS1中的元素在GROUP2中的对应编号
-如果属于进程组1的某个进程可以在RANKS1中找到,而这个进
程不属于进程组2,则RANKS2中对应RANKS1的位置返回值为
MPIUNDEFINDEDo
42fenoi/o联想
MP工函数一进程组操作函数
■MPI_Group_incl()
FORTRAN:MPI_GROUP_INCL(GROUP,RANKSzNEWGROUPAIERR)
INTEGER::GROUP,N,RANKS(*),NEWGROUP,IERR
C:intMPI_Group_incl(MPI_Group*group,intn,
int*rankszMPI_Group*newgroup)
参数说明:
INGROUP,进程组
INN,RANKS中数组元素的个数和新进程组的大小
INRANKS,将在新进程组中出现的旧进程组中的编号
OUTNEWGROUP由RANKS定义的顺序导出的新进程组
-构造新的进程组
43fenoi/o联想
MP工函数一进程组操作函数
■MPI_Group_excl()
FORTRAN:MPI_GROUP_EXCL(GROUP,RANKSzNEWGROUPAIERR)
INTEGER::GROUP,N,RANKS(*),NEWGROUP,工ERR
C:intMPI_Group_excl(MPI_Group*group,intn,
int*rankszMPI_Group*newgroup)
参数说明:
INGROUP,进程组
INN,RANKS中数组元素的个数
INRANKS,在新进程组中不出现的旧进程组中的编号
OUTNEWGROUP旧进程中不在RANKS里的元素组成的新进程组
-构造新的进程组
44fenoi/o联想
MP工函数一进程组操作函数
MPI_Group_union()
FORTRAN:MPI_GROUP_UNION(GROUP1,GROUP2,NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPrIERR
C:intMPI_Group_union(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*newgroup)
参数说明:
INGROUPlz进程组1
INGROUP2,进程组2
OUTNEWGROUP,进程组1和进程组2的并
-构造新的进程组
45fenoi/o联想
MP工函数一进程组操作函数
MP工_Group_int㊀re㊀ction()
FORTRAN:MPI_GROUP_INTERSECTION(GROUP1,GROUP2,
NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPzIERR
C:intMPI_Group_intersection(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*nawgroup)
参数说明:
INGROUP1A进程组1
INGROUP2,进程组2
OUTNEWGROUP,进程组1和进程组2的交
-构造新的进程组
46fenoi/o联想
MP工函数一进程组操作函数
MP工_Group_diff㊀r㊀nc㊀()
FORTRAN:MPI_GROUP_DIFFERENCE(GROUP1,GROUP2,
NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPzIERR
C:intMPI_Group_difference(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*n㊀wgroup)
参数说明:
INGROUP1A进程组1
INGROUP2,进程组2
OUTNEWGROUP,进程组1和进程组2的差
-构造新的进程组
47fenoi/o联想
MP工函数一通信子操作
■MP工_Comm_siz㊀()
FORTRAN:MPI_Comm_size(comm,sizezi㊀rr)
int㊀g㊀r::comm,siz㊀,i㊀rr
C:intMPI_Comm_size(MPI_commcomm,int*size)
参数说明:
INCOMM,通信因子
OUTSIZE,通信因子中的进程个数
-该函数返回与该组通信因子相关的进程数。
48fenoi/o联想
MP工函数一通信子操作
MPI_Comm_rank()
FORTRAN:MPI_Comm_rank(comm,rank,ierr)
integer::comm,rank,ierr
C:intMPI_Comm_rank(MPI_commcomm,int*rank)
参数说明:
INCOMM,通信因子
OUTRANK,通信因子中的进程编号
-该函数返回该进程在指定通信因子中的进程号(0〜进程数-1),
个进程在不同通信因子中的进程号可能不同。
49fenoi/o联想
MP工函数一通信子操作
MPI_Comm_dup()
FORTRAN:MPI_COMM_DUP(COMM,NEWCOMM,IERR)
INTEGER::COMM,NEWCOMM,工ERR
C:intMPI_Comm_dup(MPI_commcomm,
MPI_comm*nawcomm)
参数说明:
INCOMM,通信因子
OUTNEWCOMM,COMM通信因子的复缶lj
-若复制的COMM被破坏,原COMM仍保存
50fenoi/o联想
MP工函数一通信子操作
MPH_Comm_cr㊀at㊀()
FORTRAN:MPI_COMM_CREATE(COMM,GROUP,NEWCOMM,IERR)
INTEGER::COMM,GROUP,NEWCOMM,IERR
C:intMPI_Comm_create(MPI_commcommAMPI_Group
group,MPI_comm*nawcomm)
参数说明:
INCOMM,通信因子
INGROUP,通信因子COMM的一个子集
OUTNEWCOMM,对应GROUP的新通信因子
51fenoi/o联想
MP工函数一通信子操作
MPI_Comm_split()
FORTRAN:MPI_COMM_SPLIT(COMM,COLOR,KEY,NEWCOMM,IERR)
INTEGER::COMM,COLOR,KEY,NEWCOMM,工ERR
C:intMPI_Comm_split(MPI_commcomm,intcolor
intkeyAMPI_comm*n㊀wcomm)
参数说明:
INCOMM,通信因子
INCOLOR子集控制值
INGROUP,子集中进程编号的顺序
OUTNEWCOMM,由此产生的新通信因子
-这个函数划分COMM所对应的进程组为不相交的字进程组,每个进程组
中包含COLOR相同的所有进程
52fenoi/o联想
MP工函数一通信子操作
MP工r㊀㊀()
FORTRAN:MPI_COMM_FREE(COMM,IERR)
INTEGER::COMM,IERR
C:intMPI_Comm_free(MPI_comm*comm)
参数说明:
INOUTCOMM,通信因子
53fenoi/o联想
MP工函数一点到点通信函数
■MP工_S㊀nd()
FORTRAN:MPI_SEND(bufAcount,datatyp㊀,dast,tag,
comm,ierr)
〈typ㊀〉buf(*)
integer::count,i㊀rr,d㊀st,tag,comm
C:intMPI_Send(void*bufAintcountr
MP工_Datatyp㊀datatyp㊀,intd㊀st,
inttag,MPI_Commcomm)
-该函数将发送缓冲区中的count个datatyp㊀数据类型的数据
发送到目的进程
54fenoi/o联想
MP工函数一点到点通信函数
MP工_S㊀nd()
参数说明:
INBUF,所要发送消息数据的首地址
INCOUNT,发送消息数组元素的个数
INDATATYPE,发送消息的数据类型
INDEST,接收消息的进程编号
INTAG,消息标签
INCOMM,通信因子
55fenoi/o联想
MP工函数一点到点通信函数
MP工_R㊀cv()
FORTRAN:MPI_RECV(bufzcount,datatype,sourcer
tagzcomm,statuszierr)
<type>buf(*)
integer::countAierrAsourceAtagA
comm,status(MPI_STATUS_SIZE)
C:intMPI_Recv(void*buf,intcountr
MPI_Datatypedatatyp㊀,intsource,
inttagzMPI_CommcommAMPI_Status*status)
-该函数从指定的进程sourc㊀接收消息,并且该消息的数据类型
和消息标识和本接收进程指定的数据类型和消息标识相一致,
收到的消息所包含的数据元素的个数最多不能超过count.
56fenoi/o联想
MP工函数一点到点通信函数
MP工_R㊀cv()
参数说明:
OUTBUF,接收消息数据的首地址
INCOUNT,接收消息数组元素的最大个数
INDATATYPE,接收消息的数据类型
INSOURCE,发送消息的进程编号
INTAG,消息标签
INCOMM,通信因子
OUTSTATUS,接收消息时返回的状态
-接收函数可以不指定SOURCE和TAG,而分别用
MP工_ANY_SOURCE和MP工_ANY_TAG来代替
57fenoi/o联想
阻塞通信
-发送和接收是
成对出现的
■忽略这个原则
很可能会产生
死锁
■通信和同步是
成对出现的
58fenoi/o联想
参数说明
■缓冲区(buffer):指应用程序定义地用于发送或接收数据的
消息缓冲区
■数据个数(count):指发送或接收指定数据类型的个数。
-数据类型的长度*数据个数的值为用户实际传递的消息长度
■数据类型(type):MP工定义了一些缺省的数据类型,用户也
可以根据需要建立自己的数据类型。
■目的地(dest):发送进程指定的接收该消息的目的进程,也
就是接收进程的进程号(注意组间通讯的情况)。
59fenoi/o联想
参数说明
■源(source):接收进程指定的发送该消息的源进程,也就是
发送进程的进程号。如果该值为MPJANY_SOURCE表示接收任
意源进程发来的消息
■标识符(tag):由程序员指定地为标识一个消息的唯一非负整
数值(0-32767),发送操作和接收操作的标识符一定要匹配,
但对于接收操作来说,如果tag指定为MP工_ANY_TAG贝I」可与任
何发送操作的tag相匹配。
■通信因子(comm):包含源与目的进程的一组上下文相关的进
程集合,除非用户自己定义(创建)了新的通信因子,否则一般
使用系统预先定义的全局通信因子MP工_COMM_WORLD
60fenoi/o联想
参数说明
■状态(status):对于接收操作,包含了接收消息的源进程
(source)和消息的标识符(tag)等。
■C:3个域FORTRAN:3个数组
^status.MPI_SOURCE^status(MPI_SOURCE)
^status.MPI_TAG^status(MPI_TAG)
/status,MP工_ERROR^status(MPI_ERROR)
61fenoi/o联想
进程号(rank)
■在一个通信因子中,每个进程都有一个唯一的整数标识符,称作
''进程工D〃,进程号是从0开始的连续整数。
if(rank==0){
第。进程运行的程序段
}㊀1s㊀if(rank==1){
第1进程运行的程序段
62fenoi/o联想
MP工消息
-MP工消息包括信封和数据两个部分,信封指出了发送或接收消息
的对象及相关信息,而数据是本消息将要传递的内容
■数据:〈起始地址,数据个数,数据类型〉
■信封:〈源/目,标识,通信域〉
63fenoi/o联想
MPI_Send(buf,count,datatype,dest,tag,comm)
消息数据消息信封
MPI_Recv(buf,count,datatype,source,tag,comm,status)
消息数据消息信封
64fenoi/o联想
程序3、环形的消息传递
假设一共有P个进程,在进程编号为myid(myid=O,…,p-1)的
进程中有一■个整数m,把m传送到进程(myid+1)modp中
65fenoi/o联想
程序3、环形的消息传递
programring
include'mpif.h'
integermyid,pzmycomm,ierr,m,
&status(mpi_status_size),next,front,mod,n
callMPI_INIT(ierr)
callMPI_COMM_DUP(MPI_COMM_WORLD,mycomm,ierr)
callMPI_COMM_RANK(mycomm,myid,ierr)
callMPI_COMM_SIZE(mycomm,p,ierr)
m=myid
front=mod(p+myid-1,p)
n㊀xt=mod(myid+1,p)
66fenoi/o联想
程序3、环形的消息传递
if(myid.eq.O)then
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,l,MPI_INTEGER,next,1,mycomm,ierr)
m=n
㊀Is㊀
callMPI_SEND(m,1,MPI_INTEGER,next,1,mycomm,ierr)
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
endif
print*'Thevalueofmis',m,'onProcess\myid
callMPI_COMM_FREE(mycomm,ierr)
callMPIFINALIZED(ierr)
end
67fenoi/o联想
MP工函数一点到点通信函数
■MPI_GET_COUNT
FORTRAN:MPI_GET_COUNT(statuszdatatyp㊀,count,ierr)
integer::status(MPI_STATUS_SIZE),
count,datatype,i㊀rr
C:intMPI_Get_count(MPI_Status*statusz
MPI_Datatypedatatype,int*count)
参数说明:
INSTATUS,接收消息时返回的状态
INDATATYPE,接收消息的数据类型
OUTCOUNT,接收消息数组元素的个数
-MPI_GET_COUNT返回以指定的数据类型为单位,接收操作
接收到的数据的个数,接收消息时使用的是最大个数,该函
数能准确知道接收消息的个数
68fenoi/o联想
MP工函数一点到点通信函数
MP工_S㊀ndr㊀cv()
FORTRAN:MPI_SENDRECV(SENDBUFrSENDCOUNT,SENDTYPE,
DEST,SENDTAG,RECVBUF,RECVCOUNT,RECVTYPE,
SOURCE,RECVTAG,COMM,STATUS,IERR)
<type>SENDBUF(*),RECVBUF(*)
INTEGER::SENDCOUNT,SENDTYPE,DEST,SENDTAG,
RECVCOUNT,RECVTYPE,SOURCEARECVTAG,COMM,STATUS,IERR
C:intMPI_Sendrecv(void*s㊀ndbuf,intsendcountr
MP工_Datatyp㊀$㊀ndtyp㊀,intcl㊀st,int$㊀ndtag,
viod*recvbufAintrecvcount,
MPI_Datatyper㊀cvtyp㊀,intsource,intr㊀cvtag,
MP工_Commcomm,MP工_Status*status)
-这是发送和接收消息组合在一起的一个函数,好处是不用考虑
先发送还是先接收消息,从而可以避免死锁
69fenoi/o联想
MP工函数一点到点通信函数
MP工_S㊀ndr㊀cv()
参数说明:
INSENDBUF,所要发送消息数据的首地址
INSENDCOUNT,发送消息数组兀素的个数
INSENDTYPE,发送消息的数据类型
INDEST,接收消息的进程编号
INSENDTAG,发送消息标签
OUTRECVBUF,接收消息数据的首地址
INRECVCOUNT,接收消息数组兀素的最大个数
INRECVTYPE,接收消息的数据类型
INSOURCE,发送消息的进程编号
INRECVTAG,接收消息标签
INCOMM,通信因子
OUTSTATUS,接收消息时返回的状态
70fenoi/o联想
MPJSendrecv示例
■原通信部分
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,1,MPI_INTEGER,next,1,mycomm,ierr)
m=n
■可用如下函数实现
callMPI_SENDRECV(m,l,MPIINTEGER,next,1,n,l,
MPIINTEGER,front,1,mycomm,status,ierr)
m=n
71fenoi/o联想
MP工函数一点到点通信函数
MP工_S㊀ndr㊀cv_r㊀plac㊀()
FORTRAN:MPI_SENDRECV_REPLACE(BUF,COUNT,DATATYPEA
DEST,SENDTAG,SOURCEzRECVTAG,COMM,STATUS,IERR)
<type>BUF(*)
INTEGER::COUNT,DATATYPEADESTzSENDTAG,
SOURCE,RECVTAG,COMM,STATUS,IERR
C:intMPI_Sendrecv_replace(void*buf,intcount,
MP工_Datatyp㊀datatyp㊀,intcl㊀st,intsendtagz
intsource^intrecvtag,MPI_Commcomm,
MPI_Status*status)
-发送和接收使用同一个消息缓冲区,但是没有MP工_S㊀ndr㊀cv
效率高
72fenoi/o联想
MP工函数一点到点通信函数
MP工_S㊀ndr㊀cv_r㊀plac㊀()
参数说明:
OUTBUF,发送和接收消息数据的首地址
INCOUNT,发送和接收消息数组元素的个数
INDATATYPE,发送和接收消息的数据类型
INDEST,接收消息的进程编号
INSENDTAG,发送消息标签
INSOURCE,发送消息的进程编号
INRECVTAG,接收消息标签
INCOMM,通信因子
OUTSTATUS,接收消息时返回的状态
-在进行环形通信时,使用MP工_Sendr㊀cv_r㊀plac㊀非常方便
73fenoi/o联想
MPI_Sendrecv_replace^^!|
:原通信部分
callMPIRECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,l,MPI_INTEGER,next,1,mycomm,ierr)
m=n
■可用如下函数来实现
callMPI_SENDRECV_REPLACE(m,1,MPI_INTEGER,next,1,
front,1,mycomm,status,ierr)
74fenoi/o联想
MP工函数一点到点通信函数
■另外,MP工还定义了一个空进程MP工_PROC_NULL,如果通信采用这
个进程将不起任何作用
if(myid.eq.O)front=MPIPROCKNULL
if(myid.eq.p-l)next=MPIPROCKNULL
callMPI_SENDRECV_REPLACE(m,1,MPI_INTEGER,next,1,
front,1,mycomm,status,ierr)
75fenoi/o联想
MP工函数一点到点通信函数
MP工_Prob㊀()
FORTRAN:MPI_PROBE(SOURCE,TAGzCOMM,STATUS,IERR)
INTEGER::SOURCE,TAG,COMM,STATUS,工ERR
C:intMPI_Probe(intsource,inttag,
MPI_Commcomm^MPI_Status*status)
参数说明:
INSOURCE,发送消息的进程编号
INTAG,接收消息标签
INCOMM,通信因子
OUTSTATUS,返回到达消息的状态
-检查要接收的消息是否到达
-消息到达了才能返回
76fenoi/o联想
程序4、n的计算
I1/1、兀
dx二arctan(x)|;=arctan(l)-arctan(O)=arctan(l)=—
1+x2
4
令函数f(x)=4/(l+x2)
则有jf(x)dx=71
(
,
+
L
)2+■
a.o
2x/-11W
71Zf(x——H
x
Z=12xNN)
]i-0.5
xu.
Ni=\N
1
o.X:0
程序4、兀的计算—send(recv)
#include、'mpi.h〃
#include<stdio.h>
#include<math.h>
doublef(doublex);/*定义函数f(x)*/
{
return(4.0/(1.0+x*x));
}
intmain(intargc,char*argv[])
{
intdon㊀=0,n,myid,numprocs,i;
doublePI25DT=3.141592653589793238462643;
doublemypi,pi,h,sum,x;
doubl㊀startwtim㊀=0.0,㊀ndwtim㊀;
intnam㊀1㊀n;
charprocessor_name[MPI_MAX_PROCESSOR_NAME];
MP工_Statusstatus;
78fenoi/o联想
MPI_Init(&argc,Sargv);
MP1_Comm_siz㊀(MP1_C0MM_W0RLD,&numprocs);
MPI_Comm_rank(M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江宁波市慈溪市机关事业单位招聘编外人员6人(二)笔试备考题库及答案解析
- 2026广西南宁市南站路幼儿园(仁兴分园)招聘1人笔试备考题库及答案解析
- 2026年福建浦开集团有限公司福建浦盛产业发展集团有限公司福建浦丰乡村发展集团有限公司招聘30人笔试备考试题及答案解析
- 2026山东德州市宁津县人民医院招聘卫生技术人员1人笔试备考题库及答案解析
- 2026年亳州利辛县紧急救援中心选调工作人员4名笔试备考试题及答案解析
- 2026福建泉州石狮市琼林中心幼儿园合同教师招聘笔试备考题库及答案解析
- 2026中电建电力投资集团有限公司招聘3人笔试备考题库及答案解析
- 2026厦门银行三明分行零售专场招聘笔试备考试题及答案解析
- 2026浙江理工大学招聘7人(第一批)笔试备考题库及答案解析
- 2026贵州安顺市西秀区安大学校春季学期临聘教师招聘2人笔试备考试题及答案解析
- 2026年1月浙江省高考(首考)地理试题(含答案)
- 2025年医院检验科主任年终述职报告
- 2026元旦主题班会:马年猜猜乐猜成语 (共130题)【课件】
- 全屋微水泥施工方案
- 西红柿栽培管理技术要点
- 《中国金融学》课件 第4章 信用形式与信用体系-课件
- 医用Mg-Zn-Mn合金:制备、强化工艺与性能的深度剖析
- 院长发现再审申请书范文
- 2024年湖南中烟考试真题及答案
- 国家教育事业发展“十五五”规划纲要
- SAP-CO-PC-生产成本核算配置与操作
评论
0/150
提交评论