《并行程序设计H》PPT课件.ppt_第1页
《并行程序设计H》PPT课件.ppt_第2页
《并行程序设计H》PPT课件.ppt_第3页
《并行程序设计H》PPT课件.ppt_第4页
《并行程序设计H》PPT课件.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 消息传递程序设计MPI,刘 轶 北京航空航天大学 计算机学院,从程序员视角看,并行体系结构主要分为两类: 共享存储(shared-memory)系统 典型平台: - 基于多核处理器的计算机 - SMP及NUMA体系结构计算机 消息传递(message-passing)系统 - 机群系统,本章内容,几种主流的并行编程接口,本章内容3.1 MPI并行环境简介3.2 点到点通信3.3 组和通信子3.4 集合通信3.5 MPI与多线程,3.1 MPI并行环境简介,3.1 MPI并行环境简介,一、简介 MPI-Message Passing Interface 面向消息传递型并行系统的编程接口

2、主要面向机群系统(cluster) MPI之前曾广泛使用另一种编程接口PVM MPI于1994年发布,目前为v2版 经过多年技术发展,已显露出诸多不足之处,但在没有更理想编程模型和语言的情况下,MPI仍是应用最为广泛的消息传递型编程接口标准 不同厂商和研究机构推出了多个版本,主要有: MPICH LAMMPI IBM MPL MPI支持C/C+、Fortran语言编程,3.1 MPI并行环境简介,MPI的并行模式:SPMD(Single Program Multiple Data),所有节点运行相同的程序 不同的节点处理不同的数据 每个节点运行一个或多个

3、MPI进程,进程间通过发送/接收消息进行通信和同步,注意:多个并行进程间无法共享变量,只能通过消息进行交互,3.1 MPI并行环境简介,二、MPI基本环境 MPI进程的创建、启动和管理通过进程管理器(PM-Process Manager)完成 进程管理器就是MPI环境与操作系统的接口 常用的进程管理器MPD MPD是MPI环境的守护进程(daemon),MPI其他工具通过与MPD通信实现其功能 MPD由python实现的一组工具构成 意味着系统中需安装python解释器 由mpdboot 完成MPD在多个主机上的启动,以形成MPI运行环境 启动之前需配置各节点间的无密码登录,3.1 MPI并行

4、环境简介,二、MPI基本环境 MPD命令,3.1 MPI并行环境简介,二、MPI基本环境 MPI环境的安装过程示例 下载MPI源代码包并解压缩 配置mpi 编译并安装 (确认)安装python,用vi修改.bash_profile文件,3.1 MPI并行环境简介,二、MPI基本环境 MPI环境的安装过程示例 将MPI路径添加到环境变量PATH 修改用户配置文件.bash_profile,路径信息已添加,3.1 MPI并行环境简介,二、MPI基本环境 MPI环境的安装过程示例 配置节点间SSH无口令登录 (注:SSH Secure SHell) 创建公钥/私钥对文件 创建后的文件 将公钥文件拷贝

5、到其他节点的.ssh目录中的authorized_keys文件 host1host2的SSH无口令登录,3.1 MPI并行环境简介,二、MPI基本环境 MPI环境的安装过程示例 节点名添加到mpd_hosts文件,构成ring 启动并测试MPI环境,为保证节点间通信正常和性能,需关闭Linux防火墙,3.1 MPI并行环境简介,二、MPI基本环境 MPI程序编译 MPI提供编译脚本:mpiCC/mpicc/mpif77/mpif90 mpiCC-C+程序编译及链接 mpicc-C程序编译及链接 mpif77和mpif90-Fortran77和Fortran90程序编译及链接 关于编译输出可执行

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

7、piexec gdb实现与gdb的集成,进程按顺序指派在各节点上运行 进程个数与节点个数没有必然联系 问题:怎样能写出独立于进程个数和节点个数的程序?,3.1 MPI并行环境简介,三、MPI的几个基本概念 缓冲区:MPI定义了3种缓冲区 应用缓冲区:保存将要发送或接收的数据的地址空间 系统缓冲区:MPI环境为通信所准备的存储空间 用户向系统注册的缓冲区:用户使用某些API时,在程序中显式申请的存储空间,然后注册到MPI环境中供通信所用,节点间传送消息时,可能需要消息在缓冲区之间拷贝 为减少消息传输延迟 更高速的互连网络 更简单的协议栈 避免消息多次拷贝 非阻塞式发送 ,3.1 MPI并行环境简

8、介,三、MPI的几个基本概念 通信子(communicator) 是MPI环境管理进程及通信的基本设施 定义一个可以相互间通信的进程集合,进程间的消息传递需放在通信子中进行 MPI支持通信子内(Intra-communicator)通信和通信子间(Inter-communicator)通信 不同空间中的消息互不干扰 MPI启动后,自动创建2个组内通信子 MPI_COMM_WORLD:启动时的所有进程 MPI_COMM_SELF:仅包含进程自身 进程号与进程组 进程号(rank)需放在某个通信子范围内才有效 在一个通信子中,进程号从0开始编号,为一连续整数序列 通信中必须使用进程号标识消息的源和

9、目的 定义一个通信子时,也就指定了一组共享该空间的进程组(group),访问文件需要使用句柄 访问网络需要使用套接字 MPI中传送消息需要用通信子,3.1 MPI并行环境简介,四、MPI基本调用 MPI初始化与结束,通信子基本操作,3.2 点到点通信,3.2 点到点通信,一、简介 消息由发送进程、接收进程、tag唯一地标识 tag是一个用户自定义的非负整数,用于区分同一对进程间的不同消息 消息的传递涉及数据的拷贝和同步,为满足不同需求,MPI提供多种点到点通信的变体 消息的发送分为阻塞和非阻塞两种方式 消息发送函数:MPI_?Send() B:缓存模式 R:就绪模式 S:同步模式 I:立即发送

10、,即非阻塞方式,I可与B,R,S组合,3.2 点到点通信,一、简介 消息发送函数: MPI_?Send() B:缓存模式 R:就绪模式 S:同步模式 I:立即发送,即非阻塞方式,I可与B,R,S组合 消息发送和接收函数影响到各节点进程间同步关系及程序性能,应谨慎选择使用,二、标准发送和接收 标准发送和接收是阻塞式(blocking)的 直到传输在本地完成(locally complete)后,发送/接收函数才返回 本地完成与全局完成 本地完成(locally complete) :在本地进程中执行的传输工作已经完成 全局完成(globally complete):整个传输已经完成,3.2 点到

11、点通信,二、标准发送和接收,注意程序在多个节点上执行时,各节点上进程的myid值不相同,启动4个进程时,3.2 点到点通信,发送消息需指明接收进程号 接收方可从任意源接收消息,也可指定源进程 使用参数MPI_ANY_SOURCE、MPI_ANY_TAG MPI通信函数使用MPI_Status返回通信结果,标准模式下的缓冲区使用 由MPI环境决定是否对要发送的消息进行缓冲 如果缓冲了待发送的数据,则与缓冲通信模式一样,即使接收端尚未启动接收操作,发送函数也可立即返回 出于性能和资源优化考虑,MPI会提供一定数量的缓冲区,超过缓冲区容量时,发送方需要阻塞直到接收操作收取数据后才可返回 阻塞式通信中

12、,发送端完成与否不仅取决于本地进程的状态,还与远端接收进程的状态有关,3.2 点到点通信,二、标准发送和接收 阻塞式通信时发送/接收进程的几种状态 双方启动发送和接收操作 proc0会立即启动数据传输操作 发送动作早于接收动作启动 如消息长度缓冲区,proc0需等待直到proc1启动接收; 如消息长度缓冲区,消息存入缓冲区,发送函数立即返回,但实际的消息传输需等到接收启动后才开始。 发送动作迟于接收动作启动 proc0会立即启动数据传输操作,3.2 点到点通信,三、缓冲通信模式(Buffered) 用于解开阻塞式通信时发送与接收之间的耦合关系 缓冲通信模式下 即使接收进程没有启动接收操作,发送

13、方在将消息转移至缓冲区后,发送函数也可返回 开销:消息需在缓冲区间拷贝 如果消息大小超过缓冲区容量,发送函数会返回错误 与标准模式的区别在于: 标准模式由MPI环境决定是否使用缓冲,缓冲区是MPI环境提供的,缓冲不足时发送函数将阻塞 缓冲通信模式由应用程序提供缓冲区,确保发送函数不阻塞,3.2 点到点通信,三、缓冲通信模式 缓冲通信模式使用的几个函数 发送函数:MPI_Bsend(),参数与MPI_Send()相同 发送前使用MPI_Pack_size()获取消息需要的缓冲区大小,并分配缓冲区 发送前使用MPI_Buffer_attach()装配缓冲区 发送后使用MPI_Buffer_deta

14、ch()卸载缓冲区,3.2 点到点通信,四、就绪通信模式(Ready) 仅当对方的接收操作启动并准备就绪时,才可发送数据 程序员必须保证发送方发送时,接收方已启动接收操作 如果违反了这种定时假设(发送时接收方未启动接收操作),将会导致错误 发送方使用MPI_Rsend()发送消息 优缺点讨论 就绪通信模式可省去消息的缓冲以及发送/接收双方的握手操作,提高通信效率 由于对定时的额外假设,就绪模式容易出错,3.2 点到点通信,五、同步通信模式(Sychronize) 发送端可在任意时刻启动发送动作,但发送端需等待接收端开始接收数据之后才返回 即发送/接收双方达到一个确定的同步点后,通信才结束 通信

15、协议: 发送端首先向接收端发送一个消息发送请求 接收端的MPI环境将该请求保存下来 待接收进程的接收动作启动后,接收端向发送端返回一个消息发送许可 发送端收到许可后发送消息,3.2 点到点通信,六、各种通信模式小结 关于接收操作 各种通信模式的发送函数各不相同,但接收函数均为MPI_Recv() MPI_Recv()是一个阻塞操作,即:仅当接收端进程缓冲区中收到了期待的数据才返回 如果接收操作早于发送操作启动,则接收操作将等待直到接到数据后返回,3.2 点到点通信,六、各种通信模式小结 发送/接收操作将配对 -存在死锁可能性 下例中,消息tag1发送后将缓存在进程1,直到进程1执行第2个接收操

16、作;而第2个发送操作将与进程1的第1个接收操作形成同步 关于缓冲使用 缓冲模式下,由用户程序指定缓冲区,如缓冲区满,则会导致错误 标准模式下,由MPI环境提供缓冲区,缓冲区不足时,发送进程将等待直到接收操作启动(相当于同步模式),七、非阻塞式通信 MPI中消息传递时延较大,对程序性能影响很大 将通信和计算重叠可以在很大程度上隐藏通信时延 方法一:多线程线程通信等待期间,处理器可切换至其他线程 方法二:非阻塞式通信进程通信期间不阻塞,而是进行其他计算,3.2 点到点通信,七、非阻塞式通信 MPI_Isend()和MPI_Irecv()是标准发送/接收的非阻塞式版本 I:Immediately 函

17、数将在本地操作完成前返回 非阻塞通信也可使用4种模式 标准、缓冲、就绪和同步 非阻塞式通信的使用方法 进程调用非阻塞式发送/接收函数,函数将立即返回 进程可进行计算或其他操作,并调用MPI_Wait()、MPI_Test()等结束测试函数检查发送/接收操作是否完成 注意:对于非阻塞式标准发送MPI_Isend(),在发送操作完成前,不应修改缓冲区中数据,3.2 点到点通信,七、非阻塞式通信 通信测试函数,3.2 点到点通信,七、非阻塞式通信 多重结束测试,阻塞式发送可与非阻塞式接收匹配,非阻塞式发送也可与阻塞式接收匹配,3.2 点到点通信,七、非阻塞式通信 可重复的非阻塞式通信 实际应用中,常

18、常需要循环发送/接收消息 可重复的非阻塞式通信提供了一种高效的实现方法,它将通信参数与MPI内部对象绑定 通信步骤如下: 通信初始化,如调用MPI_Isend_init() 启动通信,MPI_Start() 完成通信,MPI_Wait() 释放查询对象,MPI_Request_free() 第、步可重复进行 通信操作仅在调用MPI_Start()后才启动,3.2 点到点通信,八、组合发送接收 调用MPI_Sendrecv()可将发送和接收操作组合 MPI_Sendrecv()与MPI_Send()、MPI_Recv()匹配示例代码,3.2 点到点通信,九、点到点通信小结 点到点通信支持阻塞、非

19、阻塞及多种通信模式 各种模式的主要区别体现在缓冲使用上: 标准发送利用MPI环境的默认缓冲区 缓冲发送将MPI环境的缓冲区放到用户空间管理 就绪模式相当于不要缓冲区,但发送方不能提前等待 同步模式也相当于不要缓冲区,但允许等待,3.3 集合通信,3.3 集合通信,一 、简介 集合通信的主要功能是对一组进程进行通信、同步、计算等操作 集合通信的主要功能函数,二、规约(reduce) 将组内数据进行某种规约后,结果保存在根进程(root),MPI还提供全规约操作MPI_Allreduce() 组内所有进程都作为根执行一次规约操作(所有接收缓冲区有相同拷贝) 等价于执行一次MPI_Reduce()后

20、,再执行MPI_Bcast(),3.3 集合通信,MPI支持自定义规约操作 自定义规约操作函数,并调用MPI_Op_create(),MPI预定义的规约操作符,统计3的个数,3.3 集合通信,三、扫描(scan) 相当于逐级规约 进程i对进程0, 1, , i执行规约,3.3 集合通信,四、数据广播 MPI_Bcast()以组内指定进程为根,将数据广播到组内其他进程,CPI程序: 计算圆周率PI,注:MPI_Wtime()用于 获取当前MPI墙钟时间(wall clock time),常用于统计程序执行时间,五、数据分发 MPI_Scatter()从根进程分发数据到组内所有进程,在“统计3的个数”例子中,可以用MPI_Scatter()分发数据,六、数据收集 MPI_Gather()是MPI_Scatter()的逆操作 根进程从组内所有进程收集数据,依次放入自己的接收缓冲区,3.3 集合通信,七、进程间同步 MPI_Barrier()将阻塞进程,直到组内进程都到达该点,3.4 组和通信子,3.4 组和通信子,一、简介 如果要在MPI基础上开发通用算法库,为避免与应用程序的进程相互影响,通常需要在算法库内使用组和通信子的管理机制 组(group):

温馨提示

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

评论

0/150

提交评论