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