分布内存并行程序开发课件_第1页
分布内存并行程序开发课件_第2页
分布内存并行程序开发课件_第3页
分布内存并行程序开发课件_第4页
分布内存并行程序开发课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、MPI分布内存并行程序开发 第一章并行计算概述2 为什麽要采用并行计算?串行程序速度提升缓慢可以加快速度更短的时间内解决相同的问题;相同的时间内解决更多更复杂的问题可以加大规模计算更大规模的问题3 并行计算设计的分类 共享内存ccNUMA; SMP 分布式内存MPP; Cluster4 并行化分解方法任务分解多任务并发执行功能分解分解被执行的计算区域分解分解被执行的数据6 分布内存并行方式任务并行不同参数的大量工况计算区域分解并行大规模多节点分块并行计算7 MPI的历史MPI初稿:美国并行计算中心工作会议(92年4月)MPI-1公布:第一届MPI大会(93年1月);MPI标准正式发布:1994

2、年5月;MPI-2发布:MPI论坛(97年)。9MPICH:最重要的MPI实现(/mpi/ mpich),与MPI-1规范同步发展的版本,支持部分MPI-2的特征如动态生成进程等。CHIMP:EPCC(Edinburgh Parallel Computing Center)开发。ftp:/ftp.epcc.ed.ac.uk/pub/packages/chimp/release下载。LAM(Local Area Multicomputer):Ohio State University开发。/download/下载。 MPI的实现10 第三章 MPI编程11 MPI为程序员提供一个并行环境库,程序

3、员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:MPI_INIT: 启动MPI环境MPI_COMM_SIZE: 确定进程数MPI_COMM_RANK: 确定自己的进程标识符MPI_SEND: 发送一条消息MPI_RECV: 接收一条消息MPI_FINALIZE: 结束MPI环境12 程序1、 简单例子 program maininclude mpif.h character * (MPI_MAX_PROCESSOR_NAME) process

4、or_nameinteger myid,numprocs,namelen,rc,ierr call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)call MPI_GET_PROCESSOR_NAME(processor_name,namelen,ierr)write (*,10) myid,numprocs,processor_name10 FORMAT(Hello World! Process,I2, of ,I1, on ,

5、20A)call MPI_FINALIZE(rc) end13 程序1、 简单例子#include “mpi.h”main(int argc, char *argv) int numprocs,myrank,i,j,k; MPI_Status status; char msg20; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myrank); if(myrank = 0) strcpy(msg,”Hello World”); MPI_Send(msg,

6、strlen(msg) + 1,MPI_CHAR,1,99,MPI_COMM_WORLD); else if(myrank =1) MPI_Recv(msg,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status); printf(“Receive message = %sn”,msg); MPI_Finalize();14 头文件MPI程序要求:所有包含MPI调用的程序文件头应加入:16 编译,执行:mpicc -o hello hello.c:生成执行文件hellompirun -np n hello: 加载n个进程运行,0号进程发送,1号进程接受并打印字符串17

7、进程号(rank)在一个通信因子中,每个进程都有一个唯一的整数标识符,称作“进程ID”,进程号是从0开始的连续整数。if (rank =0) 第0进程运行的程序段 else if(rank = 1) 第1进程运行的程序段19 MPI消息MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。数据:信封:20 MPI的基本函数MPI_InitMPI_Comm_sizeMPI_Comm_rankMPI_SendMPI_RecvMPI_Finalize21 MPI_Init()MPI的初始化例行函数,用于初始化MPI运行环境。必须调用;首先调用;调用

8、一次。MPI_Init (*argc,*argv) 。每个进程都有一个参数表。22 MPI_Comm_size()该函数返回与该组通信因子相关的进程数,显然这里的通讯因子必须是组内通讯因子。MPI_Comm_size (comm,*size) 23 MPI_Comm_rank()该函数返回该进程在指定通信因子中的进程号(0 进程数-1),一个进程在不同通信因子中的进程号可能不同:MPI_Comm_rank (comm,*rank) 24 MPI_Recv()该函数从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的数据类型和消息标识相一致,收到的消息所包含的数据元

9、素的个数最多不能超过count.MPI_Recv(buf,count,datatype,source,comm,status)26 MPI_Finalize()结束MPI执行环境。该函数一旦被应用程序调用时,就不能调用MPI的其它例行函数(包括MPI_Init),用户必须保证在进程调用MPI_Finalize之前把与完成进程有关的所有通信结束。MPI_Finalize ()27 缓冲区(buffer)指应用程序定义地用于发送或接收数据的消息缓冲区。29 数据个数(count)指发送或接收指定数据类型的个数。数据类型的长度 * 数据个数的值为用户实际传递的消息长度。30 数据类型(type)MP

10、I定义了一些缺省的数据类型,用户也可以根据需要建立自己的数据类型31续上页32 目的地 (dest)发送进程指定的接收该消息的目的进程,也就是接收进程的进程号(注意组间通讯的情况)。33 源 (source)接收进程指定的发送该消息的源进程,也就是发送进程的进程号。如果该值为MPI_ANY_SOURCE表示接收任意源进程发来的消息。34 标识符(tag)由程序员指定地为标识一个消息的唯一非负整数值(0-32767),发送操作和接收操作的标识符一定要匹配,但对于接收操作来说,如果tag指定为MPI_ANY_TAG则可与任何发送操作的tag相匹配。35 通信因子(comm)包含源与目的进程的一组上

11、下文相关的进程集合,除非用户自己定义(创建)了新的通信因子,否则一般使用系统预先定义的全局通信因子MPI_COMM_WORLD。36 状态(status)对于接收操作,包含了接收消息的源进程(source)和消息的标识符(tag)。在FORTRAN程序中,这个参数是包含MPI_STATUS_SIZE个整数的数组,status(MPI_SOURCE)、status(MPI_TAG)和status(MPI_ERROR)分别表示数据的进程标识、发送数据使用tag 标识和接收操作返回的错误代码。相当于一种在接受方对消息的监测机制,并且以其为依据对消息作出不同的处理(当用通配符接受消息时)。37 程序1

12、、简单例子#include “mpi.h”main(int argc, char *argv) int numprocs,myrank,i,j,k; MPI_Status status; char msg20; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myrank); if(myrank = 0) strcpy(msg,”Hello World”); MPI_Send(msg,strlen(msg) + 1,MPI_CHAR,1,99,MPI_CO

13、MM_WORLD); else if(myrank =1) MPI_Recv(msg,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status); printf(“Receive message = %sn”,msg); MPI_Finalize();38 程序2、 的计算 #include “mpi.h” #include #include double f(double x);/*定义函数f(x) */ return(4.0/(1.0+x*x); int main (int argc,char * argv) int done =0,n,myid,numprocs,i

14、; double PI25DT=3.141592653589793238462643; double mypi,pi,h,sum,x; double startwtime=0.0,endwtime; int namelen; char processor_nameMPI_MAXPROCESSOR_NAME; MPI_Status status; 01-1-1139 MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Get_process

15、or_name(processor_name,&namelen); fprint(stdout,”Process %d of %d on % sn”,myid,numprocs, processor_name); n=0; if (myid=0) printf(“Please give N=”); scanf(&n); startwtime=MPI_Wtime(); for (j=1;jnumprocs;j+) MPI_Send(&n,1,MPI_INT,j,99,MPI_COMM_WORLD); 40 else MPI_Recv(&n,1,MPI_INT,MPI_ANY_SOURCE,99,

16、MPI_COMM_WORLD,&status); h=1.0/(double) n; sum=0.0; for(i=myid+1;i=n;i+=numprocs)/* 每一个进程计算一部分矩形的面积,若进程总数numprocs为4, 将 0-1区间划分为100个矩形,则各个进程分别计算矩形块 0进程 1,5,9,13,97 1进程 2,6,10,14,98 2进程 3,7,11,15,99 3进程 4,8,12,16,100 */41 x=h*(double)i-0.5); sum+=f(x); mypi=h*sum; /*各进程并行计算得到的部分和*/ /*将部分和累加得到所有矩形的面积,该面积和即为近似PI值*/ if (myid != 0) MPI_Send(&mypi,1,MPI_DOUBLE,0,myid,MPI_COMM_WORLD); else pi=0.0;pi=pi+mypi;42 for (j=1;jnumprocs;j+) MPI_Recv(&mypi,1,MP

温馨提示

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

评论

0/150

提交评论