好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

并行编程初步PPT课件.ppt

52页
  • 卖家[上传人]:嘀嘀
  • 文档编号:263860524
  • 上传时间:2022-03-10
  • 文档格式:PPT
  • 文档大小:322KB
  • / 52 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • MPI 编 程 简 介上海超级计算中心提 纲 引言 基本MPI编程 MPI高级编程简介 实例两种内存模型 共享存储 分布式存储内 存CPUCPUCPUCPUCPU内存CPUCPUCPUCPUCPU内存内存内存内存消息传递并行程序设计 消息传递并行程序设计 用户必须通过显式地发送和接收消息来实现处理机间的数据交换 每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现 适用于大规模并行处理机(MPP)和机群(Cluster) 并行计算粒度大,适合大规模可扩展并行算法 消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法什么是MPI? Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C 一种新的库描述,不是一种语言 共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用 是一种标准或规范,而不是特指某一个对它的具体实现 MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准为什么要使用MPI? 高可移植性 MPI已在PC机、MS Windows以及所有主要的Unix工作站上和所有主流的并行机上得到实现 使用MPI作消息传递的C或Fortran并行程序可不加改变地在上述平台实现 没有更好的选择MPI的发展过程 发展的两个阶段 1994年5月完成1.0版 支持C和Fortran77 制定大部分并行功能 1997年4月完成2.0版 动态进程 并行I/O 支持Fortran 90和C+常用的MPI版本 MPICH 是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性 当前最新版本有和MPICH2 1.03 LAMMPI 美国Indiana 大学Open Systems 实验室实现 当前最新版本 更多的商业版本MPI HP-MPI,MS-MPI, 所有的版本遵循MPI标准,MPI程序可以不加修改的运行提 纲 引言基本MPI编程 MPI高级编程简介 实例从简单入手 下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序 Hello 该程序在终端打印出Hello World!字样.Hello (C语言)#include #include mpi.h“main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf(“Hello World!n); MPI_Finalize();Hello (Fortran语言)program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )print *, Hello, world!call MPI_FINALIZE( ierr )endC和Fortran中MPI函数约定 C 必须包含mpi.h MPI 函数返回出错代码或成功代码MPI_SUCCESS MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写,例:MPI_Init Fortran 必须包含mpif.h 通过子函数形式调用MPI,函数最后一个值为返回值 MPI-前缀,且函数名全部大写,例:MPI_INIT C和Fortran中MPI函数约定(续) MPI函数的参数被标志为以下三种类型 IN:参数在函数的调用中不会被修改 OUT:参数在函数的调用中可能会被修改 INOUT:参数在一些函数中为IN,而在另一些函数中为OUT MPI初始化- MPI_INIT int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR) MPI_INIT是MPI程序的第一个调用,完成MPI程序的所有初始化工作。

      所有的MPI程序的第一条可执行语句都是这条语句 启动MPI环境,标志并行代码的开始 并行代码之前,第一个mpi函数(除MPI_Initialize外) 要求main必须带参数运行否则出错 MPI结束- MPI_FINALIZE int MPI_Finalize(void) MPI_ Finalize(IERROR) MPI_INIT是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的 标志并行代码的结束,结束除主进程外其它进程 之后串行代码仍可在主进程(rank = 0)上运行(如果必须)MPI程序的编译和运行 mpif77 o hello hello.f 或 mpicc o hello hello.c 生成hello的可执行代码 mpirun np 4 hello 4,指定np的值,表示进程数,由用户指定 hello,要运行的MPI并行程序 运行MPI程序 编译:mpicc -o hello hello.c 运行:./hello 0 Aborting program ! Could not create p4 procgroup.Possible missing fileor program started without mpirun. 运行:mpirun -np 4 helloHello World!Hello World!Hello World!Hello World!Hello是如何被执行的? SPMD: Single Program Multiple Data(MIMD)#include #include mpi.h“main(int argc,char *argv) MPI_Init(&argc, &argv); printf(“Hello World!n); MPI_Finalize();#include #include mpi.h“main(int argc,char *argv) MPI_Init(&argc, &argv); printf(“Hello World!n); MPI_Finalize();#include #include mpi.h“main(int argc,char *argv) MPI_Init(&argc, &argv); printf(“Hello World!n); MPI_Finalize();#include #include mpi.h“main(int argc,char *argv) MPI_Init(&argc, &argv); printf(“Hello World!n); MPI_Finalize();#include #include mpi.h“main(int argc,char *argv) MPI_Init(&argc, &argv); printf(“Hello World!n); MPI_Finalize();Hello World!Hello World!Hello World!Hello World!开始写MPI程序 写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少进程来进行并行计算?我是哪一个进程?开始写MPI程序 MPI提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数p int MPI_Comm_size(MPI_Comm comm, int *size) 用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的ID int MPI_Comm_rank(MPI_Comm comm, int *rank)更新的Hello World(C语言)#include #include mpi.h”main( int argc, char *argv ) int myid,numprocs; MPI_Init( &argc, &argv ); MPI_Common_rank(MPI_COMMON_WORLD,&myid); MPI_Common_size(MPI_COMMON_WORLD,&numprocs); printf(“I am %d of %d n“, myid,numprocs); MPI_Finalize();更新的Hello World(Fortran)program maininclude mpif.hinteger ierr, myid, numprocscall MPI_INIT( ierr )call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )print *, I am, myid, of, numprocscall MPI_FINALIZE( ierr )End运行结果 mpicc o hello1 hello1.c mpirun -np 4 hello1结果: I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4有消息传递greetings(C语言)#include #include mpi.h”main( int argc, char *argv ) int myid,numprocs,soure; MPI_Status status; char message100; MPI_Init( &argc, &argv ); MPI_Common_rank(MPI_COMMON_WORLD,&myid); MPI_Common_size(MPI_COMMON_WORLD,&numprocs);有消息传递greetings(C语言) 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 =32767 Communicator: 缺省MPI_COMM_WORLD Group:有限/N,有序/Rank 0,1,2,N-1 Contex:Super_tag,用于标识该通讯空间为什么使用消息标签(Tag)?未使用标签使用了标签为了说明为什么要用标签,我们先来看右面一段没有使用标签的代码:这段代码打算传送A的前32个字节进入X,传送B的前16个字节进入Y.但是,如果消息B尽管后发送但先到达进程Q,就会被第一个recv()接收在X中.使用标签可以避免这个错误.在消息传递中使用标签使用标签的另一个原因是可以简化对下列情形的处理:假定有两个客户进程P和R,每个发送一个服务请求消息给服务进程Q.消息匹配接收buffer必须至少可以容纳count个由datatype参数指明类型的数据. 如果接收buf太小, 将导致溢出、出错消息匹配 参数匹配dest,tag,comm/ source,tag,comm Source = MPI_ANY_SOURCE:接收任意处理器来的数据(任意消息来源). Tag = MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息)在阻塞式消息传送中不允许Source=Dest,否则会导致死锁消息传送被限制在同一个communicator.在send函数中必须指定唯一的接收者status参数当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和tag值? 在C中,status.MPI_SOURCE, status.MPI_TAG. 在Fortran中, source=status(MPI_SOURCE),tag=status(MPI_TAG). Status还可用于返回实际接收到消息的长度 int MPI_Get_count(MPI_Status。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.