32
MPI MPI 并并并并 并并并并 并并并 并并并

MPI 并行编程   

  • Upload
    gotzon

  • View
    221

  • Download
    0

Embed Size (px)

DESCRIPTION

MPI 并行编程   . 报告人:李俊照. 内容. 1、 MPI 并行编程简介 2、 efund 并行的结果分析 3、主程序的并行思路. 虚拟分布共享存储( DSM). …. CPU. CPU. CPU. 定制网络. 总线或交叉开关. …. CPU. CPU. CPU. SM. …. P/C. P/C. P/C. ( a) SMP, 物理上单一地址空间. 定制/标准网络. ( b) DSM, 逻辑上单一地址空间. LM. LM. LM. LM. LM. LM. - PowerPoint PPT Presentation

Citation preview

Page 1: MPI 并行编程   

MPIMPI并行编程   并行编程   

  报告人:李俊照

Page 2: MPI 并行编程   

内容内容1 、 MPI并行编程简介2 、 efund并行的结果分析3、主程序的并行思路

Page 3: MPI 并行编程   

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 并行编程   
Page 5: MPI 并行编程   

什么是并行计算

进程 1

发送信息

进程 2

接收信息

传统的串行计算,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。

并行计算将进程相对独立的分配于不同的节点上,由各自独立的操作系统调度,享有独立的 CPU和内存资源(内存可以共享);进程间相互信息交换通过消息传递;

进程 1

进程 2

Page 6: MPI 并行编程   

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 并行编程   

MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信;

一个程序同时启动多份,形成多个独立的进程, 在不同的处理机上运行,拥有独立的内存空间, 进程间通信通过调用 MPI函数来实现;每个进程 开始执行时,将获得一个唯一的序号( rank )。 例如启动 P 个进程,序号依次为 0 , 1 ,…, P-1 ;

MPI并行进程的实现

Page 8: MPI 并行编程   

消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,任何支持进程间通信的并行机,均可支持消息传递并行程序设计;几乎有共享和分布存储并行计算环境均支持进程间的消息传递通信;进程 0发送一个整数给进程 1;进程 1将该数加 1,传递给进程 2;进程 2再将该数加 1,再传递给进程 3;依次类推,最后,进程 N-1将该数传递给进程0,由进程 1负责广播该数给所有进程,并打印输出。

进程 1传递信息 进程 3传递信息进程 2传递信息进程 0传递信息

Page 9: MPI 并行编程   

主 /从式 主进程将任务分发到从进程分别计算,再收集计算结果,比如计算 1+…+100,可以分成两部份。进从程计算 1+..+50和 51+..+100,主进程收集结果再相加

MPIMPI 并行编程简介并行编程简介

Page 10: MPI 并行编程   

对等式每个进程相对独立计算各自的任务比如要计算 1+…+100和 1*…*100,可以由两个进程独立计算

Page 11: MPI 并行编程   

混合模式主进程分发完任务后,参与计算如计算 1+..+100,主进程可以自己计算 1..33,分发任务 34..66和 67..100到两个从进程。可以提高效率

Page 12: MPI 并行编程   

一个简单的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 并行编程   

运行的结果

Page 14: MPI 并行编程   

MPI初始化 call MPI_Init(ierr) Integer ierr

MPI结束 call MPI_Finalize(ierr) Integer ierr

Page 15: MPI 并行编程   

当前进程标识 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 并行编程   

通信域 一个通信域是一个进程组加上一个现场,进程组是所有参加通信的进程的集合,如果一共有 N个进程参加通信,则进程编号从 0 到 N - 1;现场提供一个相对独立的通信区域

01

2

34

56

7

89 10

11

01

23

45

01

23 4

5

Page 17: MPI 并行编程   

MPI消息 MPI消息包括信封和数据两部份 信封:<源 /目,标识,通信域> 数据:<起始地址,数据个数,数据类型> MPI_Send(buf,count,datatype,dest,tag,comm)

消息数据     消息信封 In buf,count,datatype,dest,tag,comm

Page 18: MPI 并行编程   

消息接收 MPI_Recv(buf,count,datatype,source,tag,comm,status) In count,datatype,source,tag,comm Out buf,status(返回状态 )

MPI类型匹配:数据类型要一致 数据发送缓冲区

消息装配 消息传递 消息拆卸

数据接收缓冲区

Page 19: MPI 并行编程   

阻塞通信与非阻塞通信  阻塞发送

开始

结束消息成功发出

缓冲区可释放

阻塞接收

开始

结束消息成功接收

缓冲区数据可使用

阻塞消息发送与接收

Page 20: MPI 并行编程   

非阻塞发送

启动发送

立即返回

计算

通信完成

释放发送缓冲区

发送消息

非阻塞接收

启动接收

立即返回

计算

通信完成

引用接收数据

接收消息

计算与通信重叠

非阻塞消息发送与接收

Page 21: MPI 并行编程   

非阻塞消息发送 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 并行编程   

组通信 一对一

一对多MPI_ISendMPI_IRecv

MPI_SendMPI_Recv

广播MPI_Bcast

多对一 收集MPI_Gather

多对多

Page 23: MPI 并行编程   

编写安全的通信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 并行编程   

例子4/)1arctan()0arctan()1arctan(|)arctan(

11 1

0

1

0 2 xdxx

)1(4)( 2x

xf

令:

1

0)( dxxf则有:

Page 25: MPI 并行编程   

0 1

4 )1(4)( 2x

xf

N

i

N

i Nif

NNNif

1 1

)5.0(11)2

12(

Page 26: MPI 并行编程   

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 并行编程   

efundefund 并行的结果分析并行的结果分析开始

结束

getset

matrix

grid

读入参数计算并生成 fcfcpc.dat

计算并生成 rfcoil.dat

计算并生成 eplasm.dat

计算并生成 econto.dat

Page 28: MPI 并行编程   

采用对等模式进行MPI程序设计

程序的运行时间由耗时最长的进程决定

开始 结束计算

Page 29: MPI 并行编程   

在 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 并行编程   

取时间平均值,则并行时间: 1.437s串行时间: 6.860s加速比为: 6.860/1.437=4.77效率为: 4.77/4=1.19

加速比一般不会超过处理器个数, efund的并行加速比大于处理器个数,不知什么原因

Page 31: MPI 并行编程   

主程序的并行思路主程序的并行思路可扩展的先粗颗粒度,再细颗粒度

Page 32: MPI 并行编程   

 谢 谢!