MPI
This presentation is the property of its rightful owner.
Sponsored Links
1 / 32

MPI 并行编程    PowerPoint PPT Presentation


  • 164 Views
  • Uploaded on
  • Presentation posted in: General

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.

Download Presentation

MPI 并行编程   

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Mpi

MPI并行编程   

报告人:李俊照


Mpi

内容

  • 1、MPI并行编程简介

  • 2、efund并行的结果分析

  • 3、主程序的并行思路


Mpi

虚拟分布共享存储(DSM)

CPU

CPU

CPU

定制网络

总线或交叉开关

CPU

CPU

CPU

SM

P/C

P/C

P/C

(a) SMP, 物理上单一地址空间

定制/标准网络

(b) DSM, 逻辑上单一地址空间

LM

LM

LM

LM

LM

LM

(c) Cluster, 物理/逻辑上多地址空间

几种我们常见的并行计算机


Mpi

进程 2

接收信息

进程 1

发送信息

什么是并行计算

进程 1

进程 2

传统的串行计算,分为“指令”

和“数据”两个部分,并在程序

执行时“独立地申请和占有”内

存空间,且所有计算均局限于

该内存空间。

并行计算将进程相对独立的

分配于不同的节点上,由

各自独立的操作系统调度,

享有独立的CPU和内存资源

(内存可以共享);进程间

相互信息交换通过消息传递;


Mpi

MPI模型

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在并行计算界

被广泛地接受.


Mpi

MPI并行进程的实现

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

一个程序同时启动多份,形成多个独立的进程,

在不同的处理机上运行,拥有独立的内存空间,

进程间通信通过调用MPI函数来实现;每个进程

开始执行时,将获得一个唯一的序号(rank)。

例如启动P个进程,序号依次为0,1,…,P-1;


Mpi

消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,

任何支持进程间通信的并行机,均可支持消息传递并行程序设计;几乎

有共享和分布存储并行计算环境均支持进程间的消息传递通信;

进程 1

传递信息

进程 3

传递信息

进程 2

传递信息

进程 0

传递信息

进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将

该数加1,再传递给进程3;依次类推,最后,进程N-1将该数传递给进程0,

由进程1负责广播该数给所有进程,并打印输出。


Mpi

MPI并行编程简介

  • 主/从式

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


Mpi

  • 对等式

  • 每个进程相对独立计算各自的任务

  • 比如要计算1+…+100和1*…*100,可以由两个进程独立计算


Mpi

  • 混合模式

  • 主进程分发完任务后,参与计算

  • 如计算1+..+100,主进程可以自己计算1..33,分发任务34..66和67..100到两个从进程。可以提高效率


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)


Mpi

  • 运行的结果


Mpi

  • MPI初始化

  • call MPI_Init(ierr)

  • Integer ierr 

  • MPI结束

  • call MPI_Finalize(ierr)

  • Integer ierr


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


Mpi

  • 通信域

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

6

1

3

7

0

5

11

9

4

10

2

8

0

1

1

5

3

0

5

3

4

4

2

2


Mpi

  • MPI消息

  • MPI消息包括信封和数据两部份

  • 信封:<源/目,标识,通信域>

  • 数据:<起始地址,数据个数,数据类型>

  • MPI_Send(buf,count,datatype,dest,tag,comm)

  • 消息数据     消息信封

  • In buf,count,datatype,dest,tag,comm


Mpi

  • 消息接收

  • MPI_Recv(buf,count,datatype,source,tag,comm,status)

  • In count,datatype,source,tag,comm

  • Out buf,status(返回状态)

  • MPI类型匹配:数据类型要一致 

数据发送缓冲区

数据接收缓冲区

消息装配

消息拆卸

消息传递


Mpi

阻塞发送

阻塞接收

  • 阻塞通信与非阻塞通信  

开始

开始

消息成功发出

消息成功接收

结束

结束

缓冲区数据可使用

缓冲区可释放

  • 阻塞消息发送与接收


Mpi

非阻塞发送

非阻塞接收

启动发送

启动接收

立即返回

立即返回

计算

通信

重叠

通信完成

通信完成

释放发送缓冲区

引用接收数据

非阻塞消息发送与接收


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


Mpi

MPI_Send

MPI_Recv

MPI_ISend

MPI_IRecv

  • 组通信

  • 一对一

一对多

广播

MPI_Bcast

收集

MPI_Gather

多对一

多对多


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

  • 从进程1接收消息A

  • 从进程0接收消息B

  • 向进程1发送消息B

  • 向进程1发送消息A

  • 产生死锁的通信调用


Mpi

  • 例子

令:

则有:


Mpi

4

0

1


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进程汇总数据


Efund

efund并行的结果分析

开始

读入参数

getset

计算并生成fcfcpc.dat

计算并生成rfcoil.dat

matrix

计算并生成eplasm.dat

grid

计算并生成econto.dat

结束


Mpi

结束

开始

计算

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

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


Mpi

线程

计算

运行时间

运行时间

运行时间

  • 在linux集群上用4个节点运行所需要的时间

fcfcpc.dat

0.230

0.210

0.230

 0

rfcoil.dat

1.240

1.190

1.240

 1

1.410

eplasm.dat

1.380

1.520

 2

econto.dat

0.370

0.390

0.350

 3

串行程序的时间

时间单位:秒

6.780

6.840

6.960


Mpi

取时间平均值,则并行时间:1.437s

串行时间:6.860s

加速比为:6.860/1.437=4.77

效率为:4.77/4=1.19

加速比一般不会超过处理器个数,efund的并行加速比

大于处理器个数,不知什么原因


Mpi

主程序的并行思路

  • 可扩展的

  • 先粗颗粒度,再细颗粒度


Mpi

 谢 谢!


  • Login