并行程序设计ChaerH_第1页
并行程序设计ChaerH_第2页
并行程序设计ChaerH_第3页
并行程序设计ChaerH_第4页
并行程序设计ChaerH_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第三章消息传递程序设计MPI刘轶北京航空航天大学计算机学院从程序员视角看,并行体系结构主要分为两类:共享存储(shared-memory)系统

典型平台: -基于多核处理器的计算机-SMP及NUMA体系结构计算机②消息传递(message-passing)系统 -机群系统本章内容几种主流的并行编程接口PthreadsOpenMPMPI编程模型线程共享内存消息传递面向系统结构共享内存共享内存分布式内存或共享内存通信模型共享内存地址共享内存地址消息传递或共享内存地址并行粒度粗或细细粗或细同步显式隐式隐式或显式实现方式程序库编译器程序库

本章内容

3.1MPI并行环境简介

3.2点到点通信

3.3组和通信子

3.4集合通信

3.5MPI与多线程3.1MPI并行环境简介3.1MPI并行环境简介一、简介MPI---MessagePassingInterface面向消息传递型并行系统的编程接口主要面向机群系统(cluster)MPI之前曾广泛使用另一种编程接口PVMMPI于1994年发布,目前为v2版经过多年技术发展,已显露出诸多不足之处,但在没有更理想编程模型和语言的情况下,MPI仍是应用最为广泛的消息传递型编程接口标准不同厂商和研究机构推出了多个版本,主要有:MPICH√LAMMPIIBMMPLMPI支持C/C++、Fortran语言编程3.1MPI并行环境简介MPI的并行模式:SPMD(SingleProgramMultipleData)所有节点运行相同的程序不同的节点处理不同的数据每个节点运行一个或多个MPI进程,进程间通过发送/接收消息进行通信和同步注意:多个并行进程间无法共享变量,只能通过消息进行交互3.1MPI并行环境简介二、MPI基本环境MPI进程的创建、启动和管理通过进程管理器(PM--ProcessManager)完成进程管理器就是MPI环境与操作系统的接口常用的进程管理器MPDMPD是MPI环境的守护进程(daemon),MPI其他工具通过与MPD通信实现其功能MPD由python实现的一组工具构成意味着系统中需安装python解释器由mpdboot完成MPD在多个主机上的启动,以形成MPI运行环境启动之前需配置各节点间的无密码登录3.1MPI并行环境简介二、MPI基本环境MPD命令命令说明mpd启动MPD守护进程mpdtrace打印MPI运行时环境内所有MPD守护进程的信息mpdboot启动一组MPD进程mpdringtest测试消息在环境环行一周的时间mpdallexit停止运行时环境的所有进程mpdcleanup运行时环境崩溃情况下,可用该命令清除本地的Unixsocketmpdlistjobs列出作业的进程信息mpdkilljob停止某个作业的所有进程mpdsigjob对某个作业的所有进程发信号mpiexec启动一个作业(早期MPI版本使用mpirun命令)3.1MPI并行环境简介二、MPI基本环境MPI环境的安装过程示例下载MPI源代码包并解压缩配置mpi编译并安装(确认)安装python用vi修改.bash_profile文件3.1MPI并行环境简介二、MPI基本环境MPI环境的安装过程示例将MPI路径添加到环境变量PATH修改用户配置文件.bash_profile修改后的.bash_profile文件内容路径信息已添加3.1MPI并行环境简介二、MPI基本环境MPI环境的安装过程示例配置节点间SSH无口令登录(注:SSH–SecureSHell)创建公钥/私钥对文件 创建后的文件将公钥文件拷贝到其他节点的.ssh目录中的authorized_keys文件host1host2的SSH无口令登录3.1MPI并行环境简介二、MPI基本环境MPI环境的安装过程示例节点名添加到mpd_hosts文件,构成ring启动并测试MPI环境/etc/hosts文件中存储主机名称与IP地址的映射表~/mpd.hosts文件中存储MPI节点列表为保证节点间通信正常和性能,需关闭Linux防火墙3.1MPI并行环境简介二、MPI基本环境MPI程序编译MPI提供编译脚本:mpiCC/mpicc/mpif77/mpif90

mpiCC---C++程序编译及链接mpicc---C程序编译及链接mpif77和mpif90---Fortran77和Fortran90程序编译及链接关于编译输出可执行文件的位置要求各节点都可以访问该文件(注意各节点都将执行该程序)方法一:编译后手工将文件拷贝到各节点 例:$scpcpihost2:/home/test方法二:配置NFS共享目录,各节点启动时将共享目录mount到本机文件系统中,编译输出的可执行文件直接存入该目录3.1MPI并行环境简介二、MPI基本环境MPI程序的运行使用mpiexec启动MPI应用程序MPI过去使用mpirun基本命令示例:mpiexec-n<num><executable><num>表示进程个数(注意:是进程不是线程)<executable>为可执行程序名,可以是MPI程序,也可以不是MPI程序的调试MPI提供了与gdb和totalview的集成接口mpiexec–gdb实现与gdb的集成

进程按顺序指派在各节点上运行进程个数与节点个数没有必然联系问题:怎样能写出独立于进程个数和节点个数的程序?3.责1盾M拿PI牛并行狗环境档简介三、MP型I的几春个基紫本概步念缓冲惊区:MP强I定义搂了3种缓峰冲区应用山缓冲狡区:左保存胁将要撒发送质或接塑收的肯数据简的地凳址空兔间系统机缓冲森区:MP考I环境渣为通都信所炼准备奋的存裁储空帝间用户汇向系另统注悟册的沃缓冲战区:匀用户引使用屋某些AP月I时,康在程识序中补显式飘申请猴的存迫储空猛间,缸然后雹注册巴到MP底I环境晨中供某通信筑所用节点斗间传馅送消次息时煤,可金能需姐要消体息在璃缓冲隐区之分间拷榆贝为减概少消姿息传决输延暑迟更高储速的况互连窄网络更简板单的愁协议蠢栈避免耐消息群多次还拷贝非阻歪塞式飘发送…3.往1腥M持PI哲并行钞环境番简介三、MP鸣I的几锐个基逝本概微念通信狮子(c域om校mu湾ni袍ca龄to砌r)是MP耍I环境备管理解进程附及通领信的蚁基本摘设施定义抚一个繁可以冬相互未间通域信的姜进程魔集合鼻,进旧程间治的消神息传校递需负放在现通信茫子中态进行MP腐I支持处通信亭子内(I舒nt微ra谷-c望om兄mu阳ni盼ca妥to匪r)通信己和通恨信子傲间(I贪nt援er烂-c递om妇mu商ni饿ca从to冬r)通信不同夸空间宵中的谎消息父互不识干扰MP忆I启动茧后,敲自动敢创建2个组邀内通惊信子MP闸I_划CO桃MM士_W刃OR科LD:启殖动时筋的所利有进撕程MP恭I_惕CO毛MM傅_S黎EL扒F:仅朗包含便进程历自身进程稍号与将进程碎组进程叔号(r魄an端k)需放产在某恼个通致信子素范围变内才树有效在一盯个通偶信子闹中,艺进程样号从0开始瘦编号举,为碑一连搞续整被数序成列通信便中必员须使品用进足程号仁标识鼻消息楼的源怀和目懂的定义幕一个茧通信目子时姨,也录就指帖定了昼一组垮共享牢该空肥间的乘进程爱组(g杨ro猫up总)访问馒文件猜需要呈使用别句柄访问坛网络疫需要巴使用涨套接只字MP母I中传税送消排息需采要用果通信耍子3.匹1闻M油PI墙并行紫环境激简介四、MP萍I基本晃调用MP变I初始然化与富结束MPI_Init():初始化MPIMPI_Finalize():结束MPIintMPI_Init(int*argc,//命令行参量数

char**argv//命令行参量);intMPI_Finalize();MPI_Comm_size():获得指定通信子中的任务数MPI_Comm_rank():获得某个进程在通信子中的序号intMPI_Comm_size(MPI_COMMcomm,//指定的通信子

int*size//任务数);intMPI_Comm_rank(MPI_COMMcomm,//指定的通信子

int*rank//序号);通信它子基思本操砌作3.蛇2点到驻点通纱信3.聚2乐点到薪点通表信一、添简介消息优由发送秩进程、接收集进程、ta雾g唯一民地标乓识ta缓g是一帜个用劲户自犯定义巨的非弱负整贸数,伸用于义区分暂同一猾对进纺程间恶的不葬同消蒙息消息柱的传烤递涉窃及数华据的属拷贝否和同盆步,改为满溜足不企同需参求,MP检I提供睛多种报点到镜点通帽信的胃变体消息确的发膀送分税为阻塞和非阻芦塞两种薄方式消息痒发送啦函数逗:MP千I_皇??进Se叼nd胸()B:缓戴存模会式R:就成绪模贱式S:同纱步模互式I:立数即发块送,纤即非疏阻塞霜方式驼,I可与B,膀R,络S组合3.酿2聪点到遮点通宗信一、饲简介消息皇发送惕函数弱:MP纪I_岩??鸦Se北nd幼()B:缓魄存模劫式R:就痕绪模欢式S:同基步模趁式I:立捏即发鸭送,丘即非摄阻塞区方式奔,I可与B,坟R,虑S组合消息退发送蜻和接纪收函苏数影稻响到称各节伶点进剥程间刺同步凤关系斯及程万序性便能,较应谨懂慎选乳择使送用分类发送接收阻

信MPI_SendMPI_RecvMPI_IrecvMPI_Recv_initMPI_BsendMPI_RsendMPI_Ssend非阻塞通信非重复MPI_IsendMPI_RecvMPI_IrecvMPI_Recv_initMPI_IbsendMPI_IrsendMPI_ISSend重复MPI_Send_initMPI_RecvMPI_IrecvMPI_Recv_initMPI_Bsend_initMPI_Rsend_initMPI_Ssend_init二、洋标准做发送室和接纱收标准具发送鸡和接妹收是槽阻塞苗式(b状lo街ck效in宋g)的直到动传输驰在本河地完缴成(l滋oc必al谨ly澡c傍om杯pl耳et惕e)后,虚发送/接收料函数抄才返应回本地钥完成暖与全咐局完健成本地平完成(l辰oc萍al亲ly跳c弊om露pl产et妈e):在垂本地吹进程换中执妨行的筝传输沟工作胶已经熊完成全局撤完成(g朝lo吸ba雾ll拾y凳co捎mp讨le圈te既):整兵个传偿输已相经完曲成MPI_Send():阻塞式发送消息MPI_Recv():阻塞式接收消息intMPI_Send(void*buffer,//发送数据指针

intcount,//发送数据元素数

MPI_Datatypetype,//发送数据类型

intdest,//目的进程IDinttag,//识别该消息的标记

MPI_COMMcomm//MPI通信子);intMPI_Recv(void*buffer,//接收数据指针

intcount,//欲接收数据元素数

MPI_Datatypetype,//接收数据类型

intsource,//发送进程IDinttag,//识别该消息的标记

MPI_COMMcomm,//MPI通信子

MPI_Status*status//接收操作状态指针);

例:MPI_Send(buffer,10,MPI_INT,1,123,MPI_COMM_WORLD)消息缓冲区指针消息中数据个数消息数据类型目的进程号tag通信子3.必2稻点到穷点通传信二、积标准斜发送钩和接妹收#include"mpi.h"#include<stdio.h>#include<math.h>#defineBUF_SIZE10intmyid,numProcs,sbuf[BUF_SIZE],rbuf[BUF_SIZE];MPI_Statusstatus;intmain(intargc,char**argv){inti;

MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numProcs);for(i=0;i<BUF_SIZE;i++)sbuf[i]=myid+i;if(myid==0)ProcRecv();elseProcSend();

MPI_Finalize();return0;}/*main()*/intProcSend(){/*向0号进程发送消息*/printf("process:%dof%dsending...\n",myid,numProcs);

MPI_Send(sbuf,BUF_SIZE,MPI_INT,0,1,MPI_COMM_WORLD);}/*ProcSend()*/intProcRecv(){intsource;/*从0号进程以外的每个进程接收消息*/printf("process:%dof%dreceiving..n",myid,numProcs);for(source=1;source<numProcs;source++)MPI_Recv(rbuf,BUF_SIZE,MPI_INT,source,1,MPI_COMM_WORLD,&status);}/*ProcRecv()*/注意隆程序颠在多俗个节香点上歌执行驾时,惹各节斧点上植进程唉的my介id值不乞相同启动4个进艇程时3.兆2眯点到厉点通孤信发送护消息奏需指习明接雷收进坚程号接收薯方可慈从任建意源们接收蛮消息搞,也穗可指狸定源纳进程使用胁参数MP马I_番AN蜓Y_奋SO军UR么CE、MP闻I_娘AN菊Y_交TA谨GMP返I通信售函数挤使用MP亚I_涝St丸at让us返回重通信起结果typedefstructMPI_Status(intcount,//发送/接收的字节数

intcancelled,intMPI_SOURCE,//通信对端的进程号

intMPI_TAG,//消息tagintMPI_ERROR);标准我模式累下的火缓冲瓶区使毯用由MP朝I环境厘决定灭是否搁对要带发送拼的消语息进蕉行缓觉冲如果邻缓冲于了待榆发送返的数培据,悟则与窝缓冲志通信滥模式消一样贷,即呜使接奶收端泊尚未返启动益接收唤操作禾,发百送函卡数也拉可立劫即返滩回出于爪性能册和资仅源优解化考撤虑,MP给I会提泊供一咐定数甚量的溜缓冲焦区,裤超过亲缓冲撕区容喷量时逢,发墓送方伞需要匠阻塞挪直到斤接收命操作带收取细数据盆后才寨可返稀回阻塞吵式通汁信中邀,发犯送端蚁完成写与否俩不仅屯取决杨于本首地进裤程的舒状态阵,还浪与远丹端接尼收进于程的随状态呼有关3.需2劝点到掀点通乐信二、峡标准教发送益和接港收阻塞窑式通葱信时变发送/接收芦进程宁的几怪种状失态双方康启动能发送盟和接绘收操到作pr贴oc经0会立轨即启申动数漂据传生输操艺作发送纺动作清早于枝接收巩动作断启动如消源息长解度>缓冲满区,pr组oc繁0需等体待直坛到pr层oc顿1启动汤接收朱;如消旺息长帽度≤缓珍冲区尾,消粒息存悔入缓蚊冲区攻,发烈送函疑数立葡即返般回,咱但实墓际的钱消息较传输响需等移到接察收启泡动后脖才开帖始。发送塘动作秀迟于叹接收登动作稍启动pr跟oc紧0会立繁即启扰动数碌据传便输操益作3.类2艘点到紫点通吼信三、高缓冲槐通信崇模式(B爪uf栏fe苏re帽d)用于泪解开胆阻塞称式通记信时坝发送顶与接点收之但间的鸟耦合拢关系缓冲底通信速模式划下即使咏接收烘进程呆没有缩慧启动讯接收宴操作乞,发乒送方如在将宗消息港转移献至缓脊冲区炒后,饶发送节函数吸也可胶返回开销摩:消辰息需谱在缓券冲区婚间拷燥贝如果熟消息嫁大小费超过素缓冲合区容酷量,溪发送鱼函数责会返词回错航误与标生准模枯式的量区别于在于其:标准臭模式脊由MP运I环境寄决定掠是否抗使用吼缓冲兵,缓伍冲区惑是MP散I环境移提供念的,俯缓冲维不足劲时发白送函杨数将脂阻塞缓冲断通信鱼模式宁由应聪用程糖序提消供缓辰冲区蚀,确典保发挡送函炕数不朗阻塞3.乡丰2珠点到辅点通臣信三、垄缓冲非通信辫模式缓冲猎通信艳模式殖使用报的几迷个函愧数发送推函数字:MP在I_椅Bs断en范d(符),参粉数与MP歼I_圣Se宋nd分()相同发送羊前使尼用MP弟I_水Pa翻ck神_s爹iz仇e(谊)获取遮消息意需要汇的缓僻冲区肚大小腾,并裹分配决缓冲惕区发送舅前使脊用MP问I_左Bu船ff浩er械_a蓄tt遭ac升h(图)装配堡缓冲盯区发送验后使披用MP夏I_桶Bu票ff联er材_d分et视ac游h(虽)卸载根缓冲医区MPI_Pack_size():获取消息所需缓冲区大小MPI_Buffer_attach():装配通信缓冲区MPI_Buffer_detach():卸载通信缓冲区intMPI_Pack_size(intcount,//数据个数

MPI_Datatypetype,//数据类型

MPI_COMMcomm,//MPI通信子

int*size//缓冲区大小(字节数));intMPI_Buffer_attach(void*buffer,//缓冲区地址

intcount,//缓冲区大小);intMPI_Buffer_detach(void*buffer,//缓冲区地址

intcount,//缓冲区大小);3.谢2陆点到音点通厌信四、纲就绪甘通信富模式(R贤ea放dy优)仅当拢对方夺的接姓收操醋作启暖动并直准备误就绪极时,狂才可屿发送锈数据程序蝇员必泳须保欢证发却送方字发送况时,叶接收赞方已咽启动铸接收舟操作如果吨违反肤了这列种定矮时假量设(发送莫时接易收方茶未启档动接区收操吸作),将咱会导总致错葬误发送娃方使摇用MP烈I_何Rs访en使d(成)发送忆消息优缺走点讨酒论就绪震通信心模式浙可省衔去消跑息的亡缓冲久以及婆发送/接收突双方公的握熄手操群作,拒提高猪通信继效率由于固对定铁时的课额外自假设盆,就丘绪模币式容赠易出抄错3.辞2首点到仔点通舞信五、坦同步垦通信柴模式(S眠yc舟hr椒on天iz身e)发送柜端可雨在任扭意时贝刻启班动发烈送动益作,催但发送趁端需霞等待怕接收犬端开馅始接饶收数糠据之书后才搭返回即发行送/接收申双方烫达到猴一个佳确定洗的同易步点侨后,棒通信旧才结碑束通信凳协议投:发送委端首即先向烤接收强端发仇送一播个消腔息发抹送请焦求接收柜端的MP梳I环境替将该芒请求住保存毅下来待接潜收进愁程的充接收矩动作返启动您后,透接收两端向鹅发送叶端返拣回一劲个消摄息发金送许失可发送法端收益到许馆可后速发送仁消息3.冶2忽点到储点通恢信六、构各种腰通信嚼模式宗小结关于误接收司操作各种毕通信纹模式胳的发送送函驰数各紧不相缘瑞同,茄但接腹收函愧数均鹿为MP浇I_每Re亏cv烂()MP嫂I_临Re累cv世()是一秘个阻韵塞操粗作,即布:仅购当接少收端廊进程卸缓冲烛区中汗收到厅了期锯待的计数据全才返份回如果侮接收瓣操作沟早于段发送湖操作时启动报,则隶接收炒操作第将等膊待直某到接廊到数霞据后糟返回

例:MPI_Recv(buffer,10,MPI_INT,0,123,MPI_COMM_WORLD,&status)消息缓冲区指针消息中数据个数消息数据类型源进程号tag通信子状态信息3.绒2挖点到稿点通巩信六、减各种肢通信挣模式沉小结发送/接收切操作趣将配筒对--兽--存在死锁可能统性下例晌中,沃消息ta比g1发送养后将阵缓存委在进吸程1,直歪到进允程1执行残第2个接毒收操豪作;爪而第2个发理送操衡作将们与进谢程1的第1个接锹收操街作形陪成同歉步关于菠缓冲死使用缓冲宽模式毫下,奔由用沃户程想序指胸定缓趁冲区购,如判缓冲萄区满瓦,则塌会导莫致错鹅误标准游模式忽下,侍由MP骨I环境爷提供祸缓冲滩区,鹿缓冲荣区不勿足时嘉,发括送进晓程将婶等待弊直到剖接收准操作概启动(相当熄于同抵步模叉式)MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank==0){MPI_Bsend(buf1,count,MPI_REAL,1,tag1,MPI_COMM_WORLD);该操作将立即返回

MPI_Ssend(buf2,count,MPI_REAL,1,tag2,MPI_COMM_WORLD);}else{MPI_Recv(buf1,count,MPI_REAL,0,tag2,MPI_COMM_WORLD,&status);MPI_Recv(buf2,count,MPI_REAL,0,tag1,MPI_COMM_WORLD,&status);}七、妙非阻邀塞式煎通信MP衔I中消庄息传索递时抬延较羞大,误对程聋序性砖能影钻响很当大将通信缸和计肯算重蛛叠可以闹在很闸大程裳度上信隐藏姿通信即时延方法输一:宣多线伪程线程减通信灭等待群期间葱,处晨理器熄可切各换至丹其他膏线程方法浩二:围非阻买塞式低通信进程集通信聚期间料不阻降塞,择而是韵进行恼其他葡计算3.琴2筐点到坏点通早信七、霜非阻矩塞式敞通信MP诉I_情Is绞en史d(其)和MP陵I_勇Ir饱ec筹v(覆)是标纽奉准发维送/接收壁的非劳阻塞细式版辅本I:Im碑me孩di俊at壮el阁y函数轿将在敏本地肚操作练完成浓前返菠回非阻淡塞通朋信也熟可使短用4种模响式标准刚、缓嘉冲、低就绪铅和同办步非阻才塞式迎通信堆的使违用方绍法进程吃调用闷非阻隙塞式补发送/接收匙函数装,函悟数将立即通返回进程境可进喂行计祖算或疑其他旺操作价,并产调用MP惠I_尸Wa宴it随()、MP趋I_崖Te破st染()等结趁束测委试函挂数检府查发酬送/接收炕操作策是否布完成注意猎:对政于非像阻塞踏式标宾准发稍送MP析I_牺Is台en醋d(译),在袍发送辱操作太完成算前,若不应播修改叔缓冲根区中流数据3.抵2镰点到延点通郑信七、偏非阻叨塞式累通信通信桥测试辰函数MPI_Wait():等待发送/接收结束MPI_Test():测试非阻塞操作是否结束intMPI_Wait(MPI_Request*request,//请求句柄

MPI_Status*status,//状态);intMPI_Test(MPI_Request*request,//请求句柄

int*flag,//操作结束便返回为真

MPI_Status*status,//状态);MPI_Requestreq;MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank==0)MPI_Isend(sendbuf,count,MPI_INT,1,0,MPI_COMM_WORLD,&req);/*非阻塞式发送*/elseMPI_Irecv(recvbuf,count,MPI_INT,0,0,MPI_COMM_WORLD,&req);/*非阻塞式接收*/……/*计算操作*/MPI_Wait(&req,&status);/*等待发送/接收结束*/3.溉2绩点到草点通傍信七、应非阻五塞式乔通信多重谁结束拘测试函数名称功能MPI_Waitany()等待一组操作中的一个完成MPI_Testany()测试一组操作中的一个是否完成MPI_Waitall()等待一组操作全部完成MPI_Testall()测试一组操作是否全部完成MPI_Waitsome()等待一组操作中的某些完成MPI_Testsome()测试一组操作中的某些是否完成阻塞劈燕式发花送可怕与非辫阻塞娘式接清收匹灶配,嘉非阻祝塞式炕发送允也可黑与阻秒塞式兔接收披匹配3.丘2资点到墓点通巩信七、况非阻别塞式汗通信可重涂复的非天阻塞买式通旬信实际难应用罪中,及常常带需要隔循环损发送/接收锡消息可重妖复的漂非阻医塞式粉通信浇提供鞠了一枯种高铲效的耍实现克方法公,它畜将通初信参恒数与MP秤I内部悲对象亭绑定通信蔽步骤礼如下熔:通信喘初始爹化,诸如调谋用MP警I_督Is厉en狼d_知in骆it袍()启动舱通信甜,MP锄I_她St愉ar侮t(这)完成归通信样,MP郊I_危Wa糠it啄()释放滩查询犁对象威,MP枣I_观Re攻qu港es筐t_稀fr灵ee把()第②、玩③步扇可重迅复进肃行通信奖操作究仅在限调用MP兰I_畅St径ar牧t(费)后才辈启动3.昆2讲点到甩点通泼信八、绩组合总发送城接收调用MP徐I_狸Se荡nd括re拜cv恨()可将汗发送译和接脱收操表作组婆合MP卡I_嚼Se捐nd迹re斗cv谢()与MP累I_勇Se挤nd飘()、MP蹈I_饼Re魔cv严()匹配撤示例律代码MPI_Requestreq;MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank==0){MPI_Sendrecv(sbuf,BUFSIZE,MPI_INT,1,tag,rbuf,BUFSIZE,MPI_INT,1,tag,MPI_COMM_WORLD,&status);}if(rank==1){MPI_Recv(rbuf,BUFSIZE,MPI_INT,0,tag,MPI_COMM_WORLD,&status);MPI_Send(sbuf,BUFSIZE,MPI_INT,0,tag,MPI_COMM_WORLD);}3.付2枕点到隐点通招信九、豪点到忍点通桶信小典结点到撒点通召信支绞持阻高塞、映非阻还塞及剩多种勤通信办模式各种焦模式悬的主呜要区争别体巴现在蒜缓冲察使用耐上:标准勒发送笛利用MP覆I环境阴的默坛认缓驻冲区缓冲爱发送胞将MP础I环境鼠的缓价冲区武放到疏用户琴空间粉管理就绪网模式销相当搬于不称要缓敢冲区盏,但怎发送宋方不霉能提芝前等钩待同步御模式肆也相贡当于鹿不要果缓冲柏区,求但允千许等目待3.锅3集合袖通信3.3集合况通信一慌、简字介集合馅通信贱的主徒要功阔能是真对一组内进程进行控通信捐、同吵步、壳计算沃等操漠作集合卸通信惧的主切要功反能函宴数集合通信函数功能MPI_Bcast()数据广播MPI_Scatter()数据分发MPI_Gather()数据收集MPI_Reduce()规约MPI_Scan()扫描MPI_Barrier()进程间同步二、驼规约(r没ed恼uc蠢e)将组始内数根据进察行某冰种规座约后雀,结唱果保拼存在尸根进李程(r芦oo颗t)MPI_Reduce():规约操作intMPI_Reduce(void*sendbuffer,//欲发送数据的地址

void*recvbuffer,//欲接收数据的地址

intcount,//欲接收数据个数

MPI_Datatypedatatype,//数据类型

MPI_OPop,//MPI操作符

introot,//将保存结果的进程

MPI_Commcomm//通信子);intsendbuf[1];intrecvbuf[1];sendbuf[0]=rank+1;/*进程2作为根进程,执行“加”规约操作*/MPI_Reduce(sendbuf,recvbuf,1,MPI_INT,MPI_SUM,2,MPI_COMM_WORLD);MP究I还提阀供全资规约雷操作MP最I_置Al疲lr注ed敬uc出e(抢)组内之所有索进程火都作龄为根炒执行必一次动规约桑操作(所有羽接收步缓冲裕区有残相同长拷贝)等价槐于执拦行一遇次MP蛾I_湖Re打du倍ce员()后,膜再执躁行MP梨I_往Bc斧as钞t(石)3.3集合例通信MP珠I支持拿自定伶义规驼约操夏作自定百义规哑约操虫作函大数,面并调菜用MP器I_枪Op省_c辜re住at延e(号)操作符说明MPI_MAX最大MPI_MIN最小MPI_SUM求和MPI_PROD求积MPI_LAND逻辑与(logicalAND)MPI_BAND位与(bit-wiseAND)MPI_LOR逻辑或(logicalOR)MPI_BOR位或(bit-wiseOR)MPI_LXOR逻辑异或(logicalXOR)MPI_BXOR位异或(bit-wiseXOR)MPI_MAXLOC最大值及位置MPI_MINLOC最小值及位置MP婚I预定测义的驰规约沙操作完符统计3的个唱数#include"mpi.h"#include<stdio.h>intmain(intargc,char**argv){intmyid,valuenumProcs;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numProcs);length_per_process=length/numProcs;myArray=(int*)malloc(length_per_process*sizeof(int));if(myid==0)/*0号进程负责读入并分发数据*/{if((fp=fopen(*argv,“r”))==NULL){printf(“fopenfailed\n”);exit(0);}for(i=1;i<=numProcs-1;i++){/*从文件中读入应由进程i处理的数据*/…/*将数据发给进程i*/

MPI_Send(myArray,length_per_process,MPI_INT,i,tag,MPI_COMM_WORLD);}}/*if*/else{

MPI_Recv(myArray,length_per_process,MPI_INT,0,tag,MPI_COMM_WORLD);}/*各进程统计3的个数*/for(i=0;i<length_per_process;i++){if(myArray[i]==3)myCount++;}/*for*//*使用“加”规约操作对各进程的数据进行汇总*/

MPI_Reduce(&myCount,&globalCount,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);if(myid==0)printf(“Numberof3’s:%d\n”,globalCount);MPI_Finalize();return0;}/*main()*/3.3集合钩通信三、温扫描(s怨ca渠n)相当液于逐浸级规郊约进程i对进犁程0,政1躁,裕…,齐i执行且规约MPI_Scan():扫描操作intMPI_Scan(void*sendbuffer,//欲发送数据的地址

void*recvbuffer,//欲接收数据的地址

intcount,//欲接收数据个数

MPI_Datatypedatatype,//数据类型

MPI_OPop,//MPI操作符

MPI_Commcomm//通信子);intsendbuf[1];intrecvbuf[1];sendbuf[0]=rank+1;/*执行“加”扫描操作*/MPI_Scan(sendbuf,recvbuf,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);3.3集合怠通信四、祥数据吊广播MP疑I_撤Bc演as球t(棋)以组托内指愉定进积程为浮根,萌将数括据广恭播到皮组内趴其他假进程MPI_Bcast():将从根进程数据广播到组内其他进程intMPI_Bcast(void*buffer,//欲发送数据的地址

intcount,//欲接收数据个数

MPI_Datatypedatatype,//数据类型

introot,//根进程(广播源)MPI_Commcomm//通信子);if(rank==2){/*进程2读取用户输入,广播给其他进程*/scanf(“%d”,&value);}MPI_Bcast(&value,1,MPI_INT,2,MPI_COMM_WORLD);/*各进程使用value作为参数,进行计算*/……CP税I程序:计算解圆周渴率PI#include"mpi.h"#include<stdio.h>#include<math.h>doublef(doublea){return(4.0/(1.0+a*a));}intmain(intargc,char*argv[]){intn,myid,numprocs,i;doublePI25DT=3.141592653589793238462643;doublemypi,pi,h,sum,x;doublestartwtime=0.0,endwtime;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Get_processor_name(processor_name,&namelen);fprintf(stdout,"Process%dof%dison%s\n", myid,numprocs,processor_name);fflush(stdout);n=10000;/*default#ofrectangles,可改为人工输入*/if(myid==0)startwtime=MPI_Wtime();/*从进程0向其他进程分发数据*/

MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);h=1.0/(double)n;sum=0.0;for(i=myid+1;i<=n;i+=numprocs){x=h*((double)i-0.5);sum+=f(x);}mypi=h*sum;/*各进程计算结果加规约到进程0的变量pi

*/

MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(myid==0){endwtime=MPI_Wtime();printf("pi≈%.16f,Error:%.16f\n",pi,fabs(pi-PI25DT));printf("wallclocktime=%f\n",endwtime-startwtime); fflush(stdout);}MPI_Finalize();return0;}注:MP勉I_朵Wt弦im皮e(逮)用于获取裂当前MP扎I墙钟垮时间(w器al渔l谷cl例oc远k盆ti毕me趁),常灾用于你统计积程序席执行亲时间五、谎数据秀分发MP朽I_枕Sc捷at峡te涂r(庸)从根粉进程有分发傲数据骄到组槐内所券有进险程MPI_Scatter():从根进程分发数据到通信子中所有进程,包括根进程自身intMPI_Scatter(void*sendbuffer,//欲发送数据的地址

intsendcount,//欲发送数据个数

MPI_Datatypesendtype,//欲发送数据类型

void*destbuffer,//欲接收数据的地址

intdestcount,//欲接收数据个数

MPI_Datatypedesttype,//欲接收数据类型

introot,//根进程编号

MPI_Commcomm//通信子);intsendbuf[4];if(rank==2){for(i=0;i<4;i++)/*进程2负责数据初始化(或数据读取)*/scanf(“%d”,&sendbuf[i]);}/*进程2作为根进程将数据分发给各个进程*/MPI_Scatter(sendbuf,1,MPI_INT,&value,1,MPI_INT,2,MPI_COMM_WORLD);/*各进程使用value作为参数,进行计算*/……在“福统计3的个减数”丈例子莲中,身可以歉用MP铸I_哑Sc绕at侨te膨r(俯)分发羡数据六、血数据产收集MP乎I_Ga总th叮er()是MP醒I_其Sc叼at精te眉r(愚)的逆恨操作根进尽程从垄组内吴所有哄进程昆收集定数据想,依泉次放拾入自早己的代接收阻缓冲厨区MPI_Gather():从通信子中所有进程收集数据,放置到根进程中intMPI_Gather(void*sendbuffer,//欲发送数据的地址

intsendcount,//欲发送数据个数

MPI_Datatypesendtype,//欲发送数据类型

void*recvbuffer,//欲接收数据的地址

intrecvcount,//欲接收数据个数

MPI_Datatyperecvtype,//欲接收数据类型

introot,//根进程编号

MPI_Commcomm//通信子);intrecvbuf[4];/*各进程将计算结果放入result*/result=…/*进程2作为根进程从各进程收集result放入recvbuf*/MPI_Gather(&result,1,MPI_INT,recvbuf,1,MPI_INT,2,MPI_COMM_WORLD);3.3集合适通信七、域进程买间同呼步MP蛛I_贱Ba且rr索ie恼r(坑)将阻忘塞进辰程,星直到家组内仙进程轮都到悠达该屋点MPI_Barrier():组内进程同步intMPI_Barrier(MPI_Commcomm//通信子);3.商4组和烤通信志子3.4组和池通信茂子一、厌简介如果跟要在MP别I基础呼上开兵发通今用算已法库浸,为天避免雷与应洪用程初序的评进程关相互盖影响艰,通清常需贺要在径算法差库内良使用逃组和脉通信兆子的歪管理渡机制组(g晚ro化up拜):一石组有户序的堂进程季集合街,组楼内每禾个进臣程以唯进程差号(r勤an倦k)标识通信环子(c嘱om鸭mu羊ni梨ca冲to贞r流):定统义了真封装MP盛I通信爽的基努本模户型组内扁通信封子(i堡nt刃ra栽-c辟om号mu柜ni戴ca冤to疼r)同属睛一个缎组的兆进程见之间应通信肃的实抛体组间哀通信替子(i珍nt团er奴-c傍om尝mu疤ni足ca外to仗r)分属椒不同币组的阔进程坊之间稳通信佣的实扭体3.4组和吩通信研子二、厨组管圣理函数名称功能组的构建与取消MPI_Comm_group()返回与通信子comm相关的组MPI_Group_free()释放组对象MPI_Group_union()合并两个组,形成一个新组MPI_Group_intersection()求两个组的交集MPI_Group_difference()求存在于一个组而不存在于另一个组的进程,形成新组MPI_Group_incl()将进程组中前n个进程组成一个新组MPI_Group_excl()将进程组中前n个进程删除后组成一个新组访问组的相关信息MPI_Group_size()返回指定进程组中的进程个数MPI_Group_rank()返回调用进程在进程组中的编号MPI_Group_translate_ranks()返回一个进程组中的n个进程在另一个组中的编号MPI_Group_compare()比较两个进程组中的进程及编号并返回结果3.4组和滤通信躲子三、荷通信趁子管炮理MPI_Comm_create():利用进程组创建新的通信子intMPI_Comm_create(MP

温馨提示

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

评论

0/150

提交评论