《并行程序设计导论》第三章课件.ppt
《《并行程序设计导论》第三章课件.ppt》由会员分享,可在线阅读,更多相关《《并行程序设计导论》第三章课件.ppt(178页珍藏版)》请在三一办公上搜索。
1、Copyright 2010, Elsevier Inc. All rights Reserved,Chapter 3,用MPI进行分布式内存编程,An Introduction to Parallel ProgrammingPeter Pacheco,Copyright 2010, Elsevier Inc,Copyright 2010, Elsevier Inc. All rights Reserved,Roadmap,编写第一个MPI程序.常见的MPI函数.用MPI来实现梯形积分法.集合通信.MPI的派生数据类型.MPI程序的性能评估.并行排序算法.MPI程序的安全性.,# Chapte
2、r Subtitle,Copyright 2010, Elsevier Inc,分布式内存系统,Copyright 2010, Elsevier Inc. All rights Reserved,分布式内存系统Copyright 2010, Elsev,共享内存系统,Copyright 2010, Elsevier Inc. All rights Reserved,共享内存系统Copyright 2010, Elsevi,进程,进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位。通俗理解:串行应用程序编译形成的可执行代码,分为“指令”
3、和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。,进程进程是一个程序,同时包含它的执行环境(内存、寄存器、程序,正在微机上运行的进程,正在微机上运行的进程,单机内的多个进程,多个进程可以同时存在于单机内同一操作系统:由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等)。进程间相互独立(内存空间不相交):在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行。,单机内的多个进程多个进程可以同时存在于单机内同一操作系统:由,最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)
4、、规约(reduction)。消息传递的实现:共享内存或信号量,用户不必关心。进程间可以相互交换信息:例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式。,最基本的消息传递操作:发送消息(send)、接受消息(rec,同时运行于单机上的多个进程,同时运行于单机上的多个进程,进程1,内存,进程2,并行程序的单机运行方式,进程3,进程4,进程1内存进程2并行程序的单机运行方式进程3进程4,消息传递并行程序设计MPI,Copyright 2010, Elsevier Inc. All rights Reserved,消息传递并行程
5、序设计用户必须通过显式地发送和接收消息来实现处理机间的数据交换每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现适用于大规模并行处理机(MPP)和机群(Cluster),消息传递并行程序设计MPICopyright 2010,Copyright 2010, Elsevier Inc. All rights Reserved,并行计算粒度大,适合大规模可扩展并行算法消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法,Copyright 2010, Elsevier Inc,什么是MPI?,Cop
6、yright 2010, Elsevier Inc. All rights Reserved,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C。一种新的库描述,不是一种语言共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用是一种标准或规范,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,什么是MPI?Copyright 2010, Elsev,为什么要使用MPI?,Copyright 2010, Elsevier Inc. All rights
7、Reserved,高可移植性MPI已在PC机、MS Windows以及所有主要的Unix工作站上和所有主流的并行机上得到实现使用MPI作消息传递的C或Fortran并行程序可不加改变地在上述平台实现,为什么要使用MPI?Copyright 2010, El,MPI的发展过程,Copyright 2010, Elsevier Inc. All rights Reserved,发展的两个阶段1994年5月完成1.0版支持C和Fortran77制定大部分并行功能1997年4月完成2.0版动态进程并行I/O支持Fortran 90和C+,MPI的发展过程Copyright 2010, Else,常用的
8、MPI版本,Copyright 2010, Elsevier Inc. All rights Reserved,MPICH 是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性当前最新版本有MPICH 3.2http:/www.mpich.org/LAMMPI美国Indiana 大学Open Systems 实验室实现http:/lammps.sandia.gov更多的商业版本MPIHP-MPI,MS-MPI,所有的版本遵循MPI标准,MPI程序可以不加修改的运行,常用的MPI版本Copyright 2010, Else,Hello World!
9、,Copyright 2010, Elsevier Inc. All rights Reserved,(a classic),Hello World! Copyright 2010,从简单入手,Copyright 2010, Elsevier Inc. All rights Reserved,下面我们首先分别以C语言的形式给出一个最简单的MPI并行程序 Hello 该程序在终端打印出Hello World!字样.,从简单入手Copyright 2010, Elsevie,识别 MPI 进程,在并行编程中,常见的是将进程按照非负整数来进行标注.p 个进程被编号为0, 1, 2, . p-1,Co
10、pyright 2010, Elsevier Inc. All rights Reserved,识别 MPI 进程在并行编程中,常见的是将进程按照非负整数来,第一个 MPI 程序,Copyright 2010, Elsevier Inc. All rights Reserved,第一个 MPI 程序Copyright 2010, El,编译,生成hello的可执行代码,Copyright 2010, Elsevier Inc. All rights Reserved,mpicc -g -Wall -o mpi_hello mpi_hello.c,C语言编译器的包装脚本,打印警告信息,源文件,创
11、建编译后的输出文件(默认为a.out),加入调试信息,编译,生成hello的可执行代码Copyright 20,执行,Copyright 2010, Elsevier Inc. All rights Reserved,mpiexec -n ,mpiexec -n 1 ./mpi_hello,mpiexec -n 4 ./mpi_hello,用1个进程运行程序,用4个进程运行程序,执行Copyright 2010, Elsevier I,Execution,Copyright 2010, Elsevier Inc. All rights Reserved,mpiexec -n 1 ./mpi_h
12、ello,mpiexec -n 4 ./mpi_hello,Greetings from process 0 of 1 !,Greetings from process 0 of 4 !Greetings from process 1 of 4 !Greetings from process 2 of 4 !Greetings from process 3 of 4 !,ExecutionCopyright 2010, Els,3.1.2 MPI 程序,C语言.包含了main函数.标准头文件 stdio.h, string.h, etc.包含 mpi.h 头文件.所有MPI定义的标识符都由字符
13、串 “MPI_”开始.下划线后的第一字母大写。表示函数名和MPI定义的类型避免混淆,Copyright 2010, Elsevier Inc. All rights Reserved,3.1.2 MPI 程序C语言.Copyright 20,MPI程序的框架结构,MPI程序的框架结构头文件包含MPI库相关变量的声明定义与通,用C+MPI实现hello world!,#include mpi.h#include #include void main(int argc,char* argv) int myid, numprocs namelen; char processor_nameMPI_MA
14、X_PROCESSOR_NAME; MPI_Init( /*结束*/ ,第二部分,第四部分,第三部分第五部分第一部分用C+MPI实现hello worl,执行结果,执行结果,MPI基本调用,MPI为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:,MPI基本调用 MPI为程序员提供一个并行环境,从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现:MPI_INIT: 启动MPI环境MPI_COMM_SI
15、ZE: 确定进程数MPI_COMM_RANK: 确定自己的进程标识符MPI_SEND: 发送一条消息MPI_RECV: 接收一条消息MPI_FINALIZE: 结束MPI环境,从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实,(1)MPI初始化:通过MPI_Init函数进入MPI环境并完成所有的初始化工作。int MPI_Init( int *argc, char * * * argv )(2)MPI结束:通过MPI_Finalize函数从MPI环境中退出。int MPI_Finalize(void),(1)MPI初始化:通过MPI_Init函数进入MPI环境并,(3)获取进程的编
16、号:调用MPI_Comm_rank函数获得当前进程在指定通信域中的编号,将自身与其他程序区分。 int MPI_Comm_rank(MPI_Comm comm, int *rank) (4)获取指定通信域的进程数:调用MPI_Comm_size函数获取指定通信域的进程个数,确定自身完成任务比例。 int MPI_Comm_size(MPI_Comm comm, int *size),(3)获取进程的编号:调用MPI_Comm_rank函,(5)消息发送:MPI_Send函数用于发送一个消息到目标进程。 int MPI_Send(void *buf, int count, MPI_Datatyp
17、e dataytpe, int dest, int tag, MPI_Comm comm) (6)消息接受:MPI_Recv函数用于从指定进程接收一个消息 int MPI_Recv(void *buf, int count, MPI_Datatype datatyepe,int source, int tag, MPI_Comm comm, MPI_Status *status),(5)消息发送:MPI_Send函数用于发送一个消息到,最简单的hello.c,Copyright 2010, Elsevier Inc. All rights Reserved,#include #include
18、mpi.h“main( int argc, char *argv ) MPI_Init( ,最简单的hello.cCopyright 2010, E,MPI初始化- MPI_INIT,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句启动MPI环境,标志并行代码的开始并行代码之前,第一个mpi函数(除MPI_Initialize外)要求main必须带参数运行。否则出错,Copyright 2010, Elsevier In
19、c. All rights Reserved,MPI初始化- MPI_INITint MPI_Init(i,MPI结束- MPI_FINALIZE,int MPI_Finalize(void) MPI_ Finalize(IERROR)MPI_INIT是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程之后串行代码仍可在主进程(rank = 0)上运行(如果必须),Copyright 2010, Elsevier Inc. All rights Reserved,MPI结束- MPI_
20、FINALIZEint MPI_Fin,运行MPI程序 hello.c,编译:mpicc -o hello hello.c运行:./hello 0 Aborting program ! Could not create p4 procgroup.Possible missing fileor program started without mpirun.运行:mpiexec -np 4 helloHello World!Hello World!Hello World!Hello World!,Copyright 2010, Elsevier Inc. All rights Reserved,运
21、行MPI程序 hello.c编译:mpicc -o hel,Hello是如何被执行的?,SPMD: Single Program Multiple Data(MIMD),Copyright 2010, Elsevier Inc. All rights Reserved,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *a
22、rgv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,#include #include mpi.h“main(int argc,char *argv) MPI_Init(,Hello World!Hello World!Hello World!Hello World!,Hello是如何被执行的?SPMD: Single Prog,Hello程序在单机上的运行方式,Hello程序在单机上的运行方式启动程序,开始执行进程0进程,基本框架,Copyright 2010, Elsevier Inc. Al
23、l rights Reserved,基本框架Copyright 2010, Elsevier,开始写MPI程序,写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少进程来进行并行计算?我是哪一个进程?,Copyright 2010, Elsevier Inc. All rights Reserved,开始写MPI程序写MPI程序时,我们常需要知道以下两个问题的,通信子,一组可以相互发送消息的进程集合.MPI_Init 在用户启动程序时,定义由用户启动的所有进程所组成的通信子.称为 MPI_COMM_WORLD.,Copyright 2010, Elsevier Inc. All rig
24、hts Reserved,通信子 一组可以相互发送消息的进程集合.Copyright,MPI提供了下列函数来回答这些问题:用MPI_Comm_size 获得进程个数p int MPI_Comm_size(MPI_Comm comm, int *comm_sz_p)用MPI_Comm_rank 获得进程的一个叫my_rank_p的值,该值为0到p-1间的整数,相当于进程的ID int MPI_Comm_rank(MPI_Comm comm, int *my_rank_p),Copyright 2010, Elsevier Inc. All rights Reserved,MPI提供了下列函数来回
25、答这些问题:Copyright ,更新的Hello World(C语言),Copyright 2010, Elsevier Inc. All rights Reserved,#include #include mpi.h”main( int argc, char *argv ) int myid,numprocs; MPI_Init( ,更新的Hello World(C语言)Copyright ,运行结果,mpicc o hello1 hello1.cmpiexec -np 4 hello1结果: I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并行程序设计导论 并行 程序设计 导论 第三 课件
链接地址:https://www.31ppt.com/p-1292157.html