MPI 并行编程   

Preview:

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

MPIMPI并行编程   并行编程   

  报告人:李俊照

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

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, 物理物理 // 逻辑上多地址空间逻辑上多地址空间

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

什么是并行计算

进程 1

发送信息

进程 2

接收信息

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

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

进程 1

进程 2

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在并行计算界被广泛地接受 .

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

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

MPI并行进程的实现

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

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

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

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

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

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

一个简单的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初始化 call MPI_Init(ierr) Integer ierr

MPI结束 call MPI_Finalize(ierr) Integer ierr

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

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

01

2

34

56

7

89 10

11

01

23

45

01

23 4

5

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

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

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

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_ISendMPI_IRecv

MPI_SendMPI_Recv

广播MPI_Bcast

多对一 收集MPI_Gather

多对多

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

产生死锁的通信调用

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

11 1

0

1

0 2 xdxx

)1(4)( 2x

xf

令:

1

0)( dxxf则有:

0 1

4 )1(4)( 2x

xf

N

i

N

i Nif

NNNif

1 1

)5.0(11)2

12(

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

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

结束

getset

matrix

grid

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

计算并生成 rfcoil.dat

计算并生成 eplasm.dat

计算并生成 econto.dat

采用对等模式进行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

时间单位:秒

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

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

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

 谢 谢!