Download presentation
Presentation is loading. Please wait.
1
MPI并行编程 报告人:李俊照
2
内容 1、MPI并行编程简介 2、efund并行的结果分析 3、主程序的并行思路
3
几种我们常见的并行计算机 … … … 虚拟分布共享存储(DSM) CPU LM 总线或交叉开关 定制网络 SM CPU
(a) SMP, 物理上单一地址空间 CPU … 定制网络 LM 虚拟分布共享存储(DSM) (b) DSM, 逻辑上单一地址空间 P/C … 定制/标准网络 LM (c) Cluster, 物理/逻辑上多地址空间
5
什么是并行计算 传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于
进程 1 进程 2 传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于 该内存空间。 并行计算将进程相对独立的 分配于不同的节点上,由 各自独立的操作系统调度, 享有独立的CPU和内存资源 (内存可以共享);进程间 相互信息交换通过消息传递; 进程 1 发送信息 进程 2 接收信息
6
MPI(Message Passing Interface)
在当前所有的消息传递软件中, 最重要最流行的是MPI, 它能运行在所有的并行平台上, 包括SMP和PVP. 二者已经在Windows NT 和Windows 9X这样的非Unix平台上实现. 程序设计语言支持C, Fortran和Java.在国产的三大并行机系列神威、银河和曙光上都实现了对MPI和支持. MPI已经成为一种标准,应用越来越广泛。而最流行的MPI工具集当属mpich,是目前高效率的超大规模并行计算(1000个处理器)最可信赖的平台。 目标: 是提供一个实际可用的、可移植的、高效的和灵活的消息传递 接口标准. MPI以语言独立的形式来定义这个接口库, 并提供了与C、 Fortran和Java语言的绑定. 这个定义不包含任何专用于某个特别的 制造商、操作系统或硬件的特性. 由于这个原因, MPI在并行计算界 被广泛地接受.
7
MPI并行进程的实现 MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信;
一个程序同时启动多份,形成多个独立的进程, 在不同的处理机上运行,拥有独立的内存空间, 进程间通信通过调用MPI函数来实现;每个进程 开始执行时,将获得一个唯一的序号(rank)。 例如启动P个进程,序号依次为0,1,…,P-1;
8
消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关, 任何支持进程间通信的并行机,均可支持消息传递并行程序设计;几乎
有共享和分布存储并行计算环境均支持进程间的消息传递通信; 进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将 该数加1,再传递给进程3;依次类推,最后,进程N-1将该数传递给进程0, 由进程1负责广播该数给所有进程,并打印输出。 进程 1 传递信息 进程 3 进程 2 进程 0
9
MPI并行编程简介 主/从式 主进程将任务分发到从进程分别计算,再收集计算结果,比如计算1+…+100,可以分成两部份。进从程计算 和 ,主进程收集结果再相加
10
对等式 每个进程相对独立计算各自的任务 比如要计算1+…+100和1*…*100,可以由两个进程独立计算
11
混合模式 主进程分发完任务后,参与计算 如计算 ,主进程可以自己计算1..33,分发任务34..66和 到两个从进程。可以提高效率
12
一个简单的MPI程序 include 'mpif.h‘ integer myid,numprocs,ierr,rc
call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) //添加需要并行的程序 Write(*,*) "Hello World! process is :",myid // call MPI_Finalize(rc)
13
运行的结果
14
MPI初始化 MPI结束 call MPI_Init(ierr) Integer ierr call MPI_Finalize(ierr)
15
当前进程标识 通信域包含的进程数 call MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)
In MPI_COMM_WORLD 为进程所在的通信域 Out Integer myid,ierr 通信域包含的进程数 Call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) In MPI_COMM_WORLD Out Integer numprocs,ierr
16
通信域 一个通信域是一个进程组加上一个现场,进程组是所有参加通信的进程的集合,如果一共有N个进程参加通信,则进程编号从0到N-1;现场提供一个相对独立的通信区域 6 1 3 7 5 11 9 4 10 2 8 1 1 5 3 5 3 4 4 2 2
17
MPI消息 MPI消息包括信封和数据两部份 信封:<源/目,标识,通信域> 数据:<起始地址,数据个数,数据类型>
MPI_Send(buf,count,datatype,dest,tag,comm) 消息数据 消息信封 In buf,count,datatype,dest,tag,comm
18
MPI_Recv(buf,count,datatype,source,tag,comm,status)
消息接收 MPI_Recv(buf,count,datatype,source,tag,comm,status) In count,datatype,source,tag,comm Out buf,status(返回状态) MPI类型匹配:数据类型要一致 数据发送缓冲区 数据接收缓冲区 消息装配 消息拆卸 消息传递
19
阻塞通信与非阻塞通信 阻塞消息发送与接收 阻塞发送 阻塞接收 开始 开始 消息成功发出 消息成功接收 结束 结束 缓冲区数据可使用
阻塞通信与非阻塞通信 阻塞发送 阻塞接收 开始 开始 消息成功发出 消息成功接收 结束 结束 缓冲区数据可使用 缓冲区可释放 阻塞消息发送与接收
20
非阻塞发送 非阻塞接收 启动发送 启动接收 发 送 消 息 接 收 消 息 立即返回 立即返回 计算 与 通信 重叠 计 算 计 算 通信完成 通信完成 释放发送缓冲区 引用接收数据 非阻塞消息发送与接收
21
非阻塞消息发送 非阻塞消息接收 非阻塞通信的完成
MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr) In buf,count,datatype,dest,tag,comm Out request,ierr Request(返回的非阻塞通信对象) 非阻塞消息接收 MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr) In buf,count,datatype,source,tag,comm 非阻塞通信的完成 MPI_Wait(request,status) In request Out status
22
组通信 一对一 MPI_Send MPI_Recv MPI_ISend MPI_IRecv 一对多 广播 MPI_Bcast 收集 多对一
MPI_Gather 多对一 多对多
23
编写安全的通信 If (rank.eq.0) then
Call MPI_Recv(recvbuf,count,real,1,tag,comm,status,ierr) Call MPI_Rend(sendbuf,count,real,1,tag,comm,ierr) Else if (rank.eq.1) Call MPI_Recv(recvbuf,count,real,0,tag,comm,status,ierr) Call MPI_Rend(sendbuf,count,real,0,tag,comm,ierr) Endif 进程0 进程1 从进程1接收消息A 从进程0接收消息B 向进程1发送消息B 向进程1发送消息A 产生死锁的通信调用
24
例子 令: 则有:
25
4 1
26
Myid:本身进程号 Numprocs:总的进程数 For(I=myid+1;I<=n;I+=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 */ 然后0进程汇总数据
27
efund并行的结果分析 开始 getset matrix grid 结束 读入参数 计算并生成fcfcpc.dat
计算并生成rfcoil.dat matrix 计算并生成eplasm.dat grid 计算并生成econto.dat 结束
28
采用对等模式进行MPI程序设计 结束 开始 计算 程序的运行时间由耗时最长的进程决定
29
在linux集群上用4个节点运行所需要的时间
线程 计算 运行时间 运行时间 运行时间 0 fcfcpc.dat 0.230 0.210 0.230 1 rfcoil.dat 1.240 1.190 1.240 1.410 2 eplasm.dat 1.380 1.520 3 econto.dat 0.370 0.390 0.350 串行程序的时间 时间单位:秒 6.780 6.840 6.960
30
取时间平均值,则并行时间:1.437s 串行时间:6.860s 加速比为:6.860/1.437=4.77 效率为:4.77/4=1.19 加速比一般不会超过处理器个数,efund的并行加速比 大于处理器个数,不知什么原因
31
主程序的并行思路 可扩展的 先粗颗粒度,再细颗粒度
32
谢 谢!
Similar presentations