版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、mpi并行程序设计nmpi是目前最重要的并行编程工具,它具有移植性好、功能强大、效率高等多种优点,而且有多种不同免费、高效、实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,这是其他的并行编程环境所无法比拟的。什么是mpi?mpi(message passing interface )nmpi是一个库,而不是一门语言;nmpi是一种标准或规范的代表,而不特指某一个对它的具体实现;nmpi是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准;消息传递模型假设底层的消息传递模型是一组处理器,每一个处理器有自己的本地内存,并且通过互连网络实现与其他处理器的消息传递处理器内存处理器内
2、存处理器内存处理器内存处理器内存处理器内存处理器内存互连网络处理器内存mpi并行程序设计nmpi历史n机房集群环境n六个接口构成的mpi子集nmpi并行程序的两种基本模式nmpi并行程序的通信模式mpi的历史nmpi初稿:美国并行计算中心工作会议(92年4月)nmpi-1公布:第一届mpi大会(93年2月)nmpi标准正式发布:1994年5月nmpi-1.1发布:1995年6月nmpi-2发布:(以前的版本统称mpi-1) 1997年7月 mpi的实现mpich:最重要的mpi实现n与mpi-1规范同步发展的版本n支持部分mpi-2的特征(如动态生成进程等)lam(local area mul
3、ticomputer)nohio state university开发n它主要用于异构的计算机网络计算系统下载地址nmpich2(最新版本1.0.3 )/mpi/mpich/nlam-mpi(最新版本7.1.2)http:/ /download/机房环境n软件部分 操作系统:windows server 2003 mpi实现:mpich-1.2.5n硬件部分 集群系统有4个刀片(每片主要参数): 2cpu (xeon3.2ghz),2gb ram,2(4)个千兆网卡,2个scsi硬盘 机房集群环境n一个主节点(一
4、个刀片) 启用双网卡,设置内/外网ip地址,用于用户登陆、提交调试程序、管理员管理集群等。主节点开启ssh、ftp等服务。n三个从节点 用于从主节点接受计算任务并执行计算(返回结果)。从节点开启ssh服务。 节点之间的通信通过ssh协议来实现六个接口构成的mpi子集n在mpi-1中,共有128个调用接口,在mpi-2中有287个,应该说mpi是比较庞大的。但是从理论上说,mpi所有的通信功能可以用它的6个基本的调用来实现,掌握了这6个调用,就可以实现所有的消息传递并行程序的功能。n所有的mpi标识符,都以mpi前缀开头,后面紧跟一个大写字母和一系列小写字母以及下划线。n、mpi初始化:mpi_
5、init函数用法:mpi_init(&argc , &argv)每一个mpi进程调用的第一个mpi函数都是mpi_init。该函数指示系统完成所有的初始化工作,以备对后续mpi库的调用进行处理。n、 mpi结束:mpi_finalize函数用法:mpi_finalize()在一个进程执行完其全部mpi库函数调用后,将调用函数 mpi_finalize,从而让系统释放分配给mpi的资源。它是mpi程序的最后一条可执行语句,否则程序的运行结果是不可预知的。n、确定进程的标识符用法:mpi_comm_rank( mpi_comm_world ,&id) 当mpi初始化后,每一
6、个活动进程变成了一个叫做mpi_comm_world的通信域中的成员。通信域是一个不透明的对象,提供了在进程之间传递消息的环境。在一个通信域内的进程是有序的。在一个有p个进程的通信域中,每一个进程有一个唯一的序号(id号),取值为0p。进程可以通过调用函数mpi_comm_rank来确定它在通信域中的序号。n4、确定进程数量 用法:mpi_comm_size( mpi_comm_world ,&p) 进程通过调用函数mpi_comm_size来确定一个通信域中 的进程总数。n、消息发送函数mpi_send(buf,count,datatype,dest,tag,comm)参数说明:in
7、 buf:发送缓冲区的起始地址in count:将要发送的数据的个数in datatype:发送数据的数据类型in dest:目的进程标识号in tag:消息标志in comm:通信域mpi_send将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志,就可以把本次发送的消息和本进程向同一目的进程发送的其他消息区别开。n、消息接收函数mpi_recv(buf,count,datatype,source,tag,comm,status)参数说明: out buf:发送缓冲区的起始地址 in cou
8、nt:将发送的数据的个数 in datatype:发送数据的数据类型 in dest:目的进程标识号 in tag:消息标志 in comm:通信域 out status:返回类型(是由三个域组成的结构类型,这三个域分别是: mpi_source、mpi_tag和mpi_error)mpi_recv从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。mpi预定义数据类型nmpi预定义类型与c数据类型对应关系一般的mpi程序设计流程图 mpi_init()mpi_comm_rank
9、 ()mpi_comm_size ()建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:计算控制程序体;进程间通信;mpi_finalize ()退出mpi系统程序参数说明end一个简单的发送和接收的例子n首先输出几个进程分别运行在哪一台机子.这里调用一个mpi_get_processor_name获得本机的名字.n接着进程0向其他进程发送问候信息,其他进程接收进程0的消息.并输出这一过程.n#includempi.hn#includen#includenvoid main (int argc, char *argv)nnchar message20;nint i,myid,nump
10、rocs;nint namelen;nmpi_status status;nchar processor_namempi_max_processor_name;nmpi_init(&argc, &argv);n mpi_comm_size(mpi_comm_world, &numprocs);nmpi_comm_rank(mpi_comm_world, &myid);nmpi_get_processor_name(processor_name, &namelen);ncouthello world!processmyid of numprocs on p
11、rocessor_nameendl;n if(myid=0)nstrcpy(message,“hello,world!);nfor(i=1;inumprocs ;i+)nmpi_send(message,strlen(message),mpi_char,i,99,mpi_comm_world);n coutprocess 0 sendmessageto process myidendl;nnnelse nmpi_recv(message,20,mpi_char,mpi_any_source,0,mpi_comm_world,&status);n coutprocessmyidrecvi
12、vedmessagefrom process 0endl;nn mpi_finalize();n开启个进程运行结果:开启个进程运行结果:mpi并行程序的两种基本模式n两种最基本的并行程序设计模式:n对等模式:各个部分地位相同,功能和代码基本一致,只不过是处理的数据或对象不同,也容易用同样的程序来实现。(典型应用如jacobi迭代)n主从模式:具有主进程和从进程,主进程接收从进程的处理结果,并进行汇总处理(典型应用如矩阵向量乘法)对等模式并行jacobi程序 这里的 jacobi迭代是计算一个矩阵的数据二维数组a(m,m)。其边界值边界赋为8,内部初值为0,通过迭代求矩阵各点的值. 假设需要迭代
13、的数据是m*m的二维数组a(m,m),令m=4*n,按上图进行数据划分,则分布在4个不同进程上的数据分别是: 进程0:a(m,1:n); 进程1:a(m,n+1:2*n); 进程2:a(m,2*n+1:3*n); 进程3:a(m,3*n+1:4*n). 由于在迭代过程中,边界点新值的计算需要相邻边界其他块的数据,因此在每一个数据块的两侧各增加1列的数据空间,用于存放从相邻数据块通信得到的数据。每个数据块的大小就从m*n扩大到m*(n+2)。 n为了并行求解,这里将参加迭代的数据按列进行分割,假设有4个进程同时并行计算,数据的分割结果如图:n边界点新值的计算需要相邻边界其他块的数据,因此在每一个
14、数据块的两侧各增加1列进程0进程1进程2进程3按列划分进程进程0进程进程1进程进程2进程进程3发送发送发送发送发送发送发送发送发送发送发送发送接收接收接收接收接收接收接收接收接收接收接收接收例子:并行jacobi程序program maininclude mpif.hinteger totalsize,mysize,stepsparameter (totalsize =16)(定义全局数组的规模)parameter (mysize =totalsize/4,steps=10)integer n,myid,numprocs,i,j,rcreal a(totalsize,mysize+2),b(t
15、otalsize,mysize+2)integer begin_col,end_col,ierrinteger status(mpi_status_size)call mpi_init(ierr)call mpi_comm_rank(mpi_comm_world,myid,ierr)call mpi_comm_size(mpi_comm_world,numprocs,ierr)print *,”process”, myid,” of”,numprocs,” is alive”n迭代计算一个二维数组a(m,m)(数组初始化)do j=1,mysize+2 do i=1,totalsize a(i
16、,j)=0.0 end doend doif (myid.eq.0) then do i=1,totalsize a(i,2)=8.0 end doend ifif (myid.eq.3) then do i=1,totalsize a(i,mysize+1)=8.0 end doend ifdo i=1,mysize+2 a(1,i)=8.0 a(totalsize,i)=8.0end do(jacobi迭代部分)do n=1,steps(从右侧的邻居得到数据) if (myid.lt.3)then call mpi_recv(a(1,mysize+2),totalsize,mpi_real
17、,myid+1, 10,mpi_comm_world,status,ierr) end if(向左侧的邻居发送数据) if (myid.gt.0)then call mpi_send(a(1,2),totalsize,mpi_real,myid-1, 10,mpi_comm_world,ierr) end if(向右侧的邻居发送数据) if (myid.lt.3) then call mpi_send(a(1,mysize+1),totalsize,mpi_real,myid+1, 10,mpi_comm_world,ierr) end if(从左侧的邻居接收数据) if (myid.gt.0
18、) then call mpi_recv(a(1,1),totalsize,mpi_real,myid-1, 10,mpi_comm_world,status,ierr) end ifbegin_col=2end_col=mysize+1if (myid.eq.0) then begin_col=3 end ifif (myid.eq.3) then end_col=mysize end ifdo j=begin_col,end_col do i=2,totalsize-1 b(i,j)=0.25*(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j) end do end
19、dodo j=begin_col,end_col do i=2,totalsize-1 a(i,j)=b(i,j) end doend doend dodo i=2,totalsize-1 print *,myid,(a(i,j),j=begin_col,end_col)end docall mpi_finalize(rc)end主从模式矩阵向量乘n对于矩阵c=a*b,主进程将向量b广播给所有的从进程,然后将矩阵a的各行依次发送给从进程。从进程计算一行和b相乘的结果然后将结果发送给主进程。主进程循环向各个从进程发送一行的数据直到将a各行的数据发送完毕。一旦主进程将a的各行发送完毕则每收到一个结
20、果就向相应的从进程发送结束标志,从进程接收到结束标志后退出执行主进程收集完所有的结果后也结束。从进程主进程发送矩阵a的各行数据回收各行与b相乘的结果计算计算计算计算送回结果例子:矩阵向量乘program maininclude “mpif.h”integer max_rows,max_cols,rows,colsparameter (max_rows=1000,max_cols=1000)double precision a(max_rows,max_cols),b(max_cols),c(max_cols)double presicion buffer(max_cols),ansintege
21、r myid,master,numprocs,ierr,status(mpi_status_size)integer i,j,numsent,numrcvd,senderinteger anstype,rown计算矩阵call mpi_init(ierr)call mpi_comm_rank(mpi_comm_world,myid,ierr)call mpi_comm_size(mpi_comm_world,numprocs,ierr)master=0rows=100cols=100if (myid.eq.master) then (主进程对矩阵a和b赋初值) do i=1,cols b(i)
22、=1 do j=1,rows a(i,j)=i end do end donumsent =0 numrcvd =0 (将矩阵b发送给所有其他的从进程,通过下面的广播语句实现) call mpi_bcast(b,cols,mpi_double_precision,master,* mpi_comm_world,ierr) (依次将矩阵a的各行发送给其他的numprocs-1个从进程) do i=1,min(numprocs-1,rows) do j=1,cols (将一行的数据取出来依次放到缓冲区中) buffer(j)=a(i,j) end do (将准备好的一行数据发送出去) call m
23、pi_send(buffer,cols,mpi_double_precision,i,i,* mpi_comm_world,ierr) numsent =numsent+1 end do (对所有的行,依次接收从进程对一行数据的计算结果) do i=1,row call mpi_recv(ans,1,mpi_double_precision,mpi_any_source,* mpi_any_tag,mpi_comm_world,status,ierr) sender=status (mpi_source) anstype =status (mpi_tag) (将该行数据赋给结果数组c的相应单元
24、) c(anstype)=ans (如果还有其他的行没有被计算,则继续发送) if (numsent.lt.rows) then do j=1,cols (准备好新一行的数据) buffer(j)=a(numsent+1,j) end do (将该行数据发送出去) call mpi_send(buffer,cols,mpi_double_precision,sender,* numsent+1,mpi_comm_world,ierr) numsent =numsent+1else (若所有行都已发送出去,则每接收一个消息则向相应的从进程发 送一个标志为0的空消息,终止该从进程的执行) call
25、 mpi_send(1.0,0,mpi_double_precision,sender,0,* mpi_comm_world,ierr) end if end doelse (下面为从进程的执行步骤,首先是接收数组b) call mpi_bcast(b,cols,mpi_double_precision,master,* mpi_comm_world,ierr) (接收主进程发送过来的矩阵a一行的数据) call mpi_recv(buffer,cols,mpi_double_precision,master,* mpi_any_tag,mpi_comm_world,status,ierr)(若接收到标志为0的消息,则退出执行) if (status(mpi_tag).ne.0) then ro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025赣州地质博物馆招聘编外讲解员5人考试笔试备考试题及答案解析
- 2026“梦想靠岸”招商银行乌鲁木齐分行冬季校园招聘笔试考试参考题库及答案解析
- 2025广东中山市古镇镇人民政府所属事业单位招聘事业单位人员10人(第二期)笔试考试备考试题及答案解析
- 2026河北省气象局招聘应届毕业生10人(第2602号)笔试考试备考试题及答案解析
- 2025年甘肃省金昌市金川区新华路街道社区卫生服务中心招聘专业技术人员笔试考试备考试题及答案解析
- 2025四川卫生康复职业学院招聘编外人员10人笔试考试参考题库及答案解析
- 2025普洱市检验检测院编制外工作人员招聘(1人)笔试考试备考题库及答案解析
- 2025年天津市应急管理事务中心公开招聘工作人员3人考试笔试备考题库及答案解析
- 2026广西现代物流集团校园招聘(50人)笔试考试参考题库及答案解析
- 2025山东省立第三医院招聘29人笔试考试备考试题及答案解析
- 北师大版数学七年级上册期中综合能力测评卷(含解析)
- 农业经理人考试题库四级及答案
- 2025年入团考试知识总结试题及答案
- 2025年健康险行业分析报告及未来发展趋势预测
- JJF 2291-2025辉光放电质谱仪校准规范
- 出租注册地址合同范本
- 统编版(2024)三年级上册道德与法治第二单元 爱科学 学科学 教案(4-6课)
- GB/T 24460-2025太阳能光伏照明装置总技术规范
- 2025年通信技术公司工作人员招聘考试笔试试题(附答案)
- 生态城市绿色建筑协同-洞察与解读
- 2025至2030中国车队管理系统行业项目调研及市场前景预测评估报告
评论
0/150
提交评论